public class RelayAutofacInitializer : IAutofacInitializer { private readonly IAutofacInitializer _autofacInitializer; private readonly Action _init; public RelayAutofacInitializer(IAutofacInitializer autofacInitializer, Action init) { _autofacInitializer = autofacInitializer; _init = init; } public void RegisterDependenciesForContainer(ContainerBuilder containerBuilder) { if (_autofacInitializer != null) _autofacInitializer.RegisterDependenciesForContainer(containerBuilder); if (_init != null) _init(containerBuilder); } public void InitializeUsingContainer(ILifetimeScope container) { if (_autofacInitializer != null) _autofacInitializer.InitializeUsingContainer(container); } } public interface IAutofacInitializer { void RegisterDependenciesForContainer(ContainerBuilder containerBuilder); void InitializeUsingContainer(ILifetimeScope container); } public class CompositeRoot { private readonly ILifetimeScope _container; private CompositeRoot(ILifetimeScope container) { _container = container; } public static void Init(IAutofacInitializer initializer = null) { var builder = new ContainerBuilder(); if(initializer != null) initializer.RegisterDependenciesForContainer(builder); var container = builder.Build(); if(initializer != null) initializer.InitializeUsingContainer(container); var root = new CompositeRoot(container); Instance = root; } public static CompositeRoot Instance { get; private set; } public CompositeRoot CreateChild(string name, IAutofacInitializer initializer) { ILifetimeScope lifetimeScope = _container.BeginLifetimeScope(initializer.RegisterDependenciesForContainer); initializer.InitializeUsingContainer(lifetimeScope); var root = new CompositeRoot(lifetimeScope); return root; } public void PerformOnChildScopeUsingCustomInit(IAutofacInitializer initializer, Action @delegate) { using (var lifetimeScope = _container.BeginLifetimeScope(initializer.RegisterDependenciesForContainer)) { initializer.InitializeUsingContainer(lifetimeScope); @delegate(lifetimeScope); } } public T Resolve() { return _container.Resolve(); } }