using System.Collections.Generic;
using Unity.Interception;
using Unity.Interception.ContainerIntegration;
using Unity.Interception.InterceptionBehaviors;
using Unity.Interception.Interceptors.InstanceInterceptors.InterfaceInterception;
using Unity.Interception.PolicyInjection.Pipeline;
public static void Main()
var container = new UnityContainer();
container.AddExtension(new Interception());
var interceptors = new InjectionMember[]
new Interceptor<InterfaceInterceptor>(),
new InterceptionBehavior<MethodInterceptor>()
container.RegisterType<IParent, Parent>();
container.RegisterType<IChild, Child>(interceptors);
container.RegisterType<IGrandChild, GrandChild>(interceptors);
var parent = container.Resolve<IParent>();
Console.WriteLine("Hello World");
public class Parent : IParent
public Func<IChild> CreateChild { get; }
public Parent(Func<IChild> createChild)
CreateChild = createChild;
private IList<IChild> Items = new List<IChild>();
Items.Add(CreateChild());
foreach (var child in Items)
public class Child : IChild
public IGrandChild Grandchild { get; }
public Child(IGrandChild grandchild)
Console.WriteLine("Child ran!");
public interface IGrandChild
public class GrandChild : IGrandChild
throw new Exception("Wohoo!!!");
Console.WriteLine("Grandchild ran!");
public class MethodInterceptor : IInterceptionBehavior
public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
var target = input.Target.GetType().Name;
var method = input.MethodBase.Name;
var old = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine($"{target}.{method}");
Console.ForegroundColor = old;
var result = getNext()(input, getNext);
if (result.Exception != null)
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"{target}.{method} threw an exception: {result.Exception.Message}");
Console.WriteLine(result.Exception.StackTrace);
Console.ForegroundColor = old;
result = input.CreateMethodReturn(null);
public IEnumerable<Type> GetRequiredInterfaces()