using Microsoft.Practices.Unity;
public static void Main()
var container = new UnityContainer();
container.RegisterType<IFirstService, FirstService>(new HierarchicalLifetimeManager());
container.RegisterType<ISecondService, SecondService>(new HierarchicalLifetimeManager());
container.RegisterType<IThirdService, ThirdService>(new HierarchicalLifetimeManager());
container.RegisterType<IFacadeOne, FacadeOne>(new HierarchicalLifetimeManager());
container.RegisterType<IFacadeTwo, FacadeTwo>(new HierarchicalLifetimeManager());
container.RegisterType<TaskScheduler>(new HierarchicalLifetimeManager());
container.RegisterInstance<ITaskScheduler>(new UnityChildScopedTaskScheduler(container), new ContainerControlledLifetimeManager());
container.RegisterType<MainController>(new ContainerControlledLifetimeManager());
var controller = container.Resolve<MainController>();
controller.TaskSchedulerWrite();
public class UnityChildScopedTaskScheduler : ITaskScheduler, IDisposable
private IUnityContainer childContainer;
private ITaskScheduler realTaskScheduler;
private ITaskScheduler taskScheduler
if(realTaskScheduler == null)
realTaskScheduler = childContainer.Resolve<TaskScheduler>();
return realTaskScheduler;
public UnityChildScopedTaskScheduler(IUnityContainer container)
childContainer = container.CreateChildContainer();
Console.WriteLine("Proxied");
childContainer.Dispose();
public class TaskScheduler : ITaskScheduler
private readonly IFacadeOne facadeOne;
private readonly IFacadeTwo facadeTwo;
public TaskScheduler(IFacadeOne facadeOne, IFacadeTwo facadeTwo)
this.facadeOne = facadeOne;
this.facadeTwo = facadeTwo;
Console.WriteLine("TaskScheduler: " + GetHashCode());
public class FacadeOne : IFacadeOne
private readonly IFirstService firstService;
private readonly ISecondService secondService;
public FacadeOne(IFirstService firstService, ISecondService secondService)
this.firstService = firstService;
this.secondService = secondService;
Console.WriteLine("\tFacadeOne: " + GetHashCode());
Console.WriteLine("\t\tFirstService: " + firstService.GetHashCode());
Console.WriteLine("\t\tSecondService: " + secondService.GetHashCode());
public class FacadeTwo : IFacadeTwo
private readonly IFirstService firstService;
private readonly IThirdService thirdService;
public FacadeTwo(IFirstService firstService, IThirdService thirdService)
this.firstService = firstService;
this.thirdService = thirdService;
Console.WriteLine("\tFacadeTwo: " + GetHashCode());
Console.WriteLine("\t\tFirstService: " + firstService.GetHashCode());
Console.WriteLine("\t\tThirdService: " + thirdService.GetHashCode());
public class MainController
private readonly IFacadeOne facadeOne;
private readonly IFacadeTwo facadeTwo;
private readonly ITaskScheduler taskScheduler;
public MainController(IFacadeOne facadeOne, IFacadeTwo facadeTwo, ITaskScheduler taskScheduler)
this.facadeOne = facadeOne;
this.facadeTwo = facadeTwo;
this.taskScheduler = taskScheduler;
Console.WriteLine("MainController: " + GetHashCode());
public void TaskSchedulerWrite()
public interface IFacadeOne { void Write(); }
public interface IFacadeTwo { void Write(); }
public interface IFirstService { }
public interface ISecondService { }
public interface IThirdService { }
public interface ITaskScheduler { void Write(); }
public class FirstService: IFirstService { }
public class SecondService: ISecondService { }
public class ThirdService: IThirdService { }