Created
June 27, 2012 15:41
-
-
Save jeremiahredekop/3004915 to your computer and use it in GitHub Desktop.
Composite Root Helpers
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class RelayAutofacInitializer : IAutofacInitializer | |
{ | |
private readonly IAutofacInitializer _autofacInitializer; | |
private readonly Action<ContainerBuilder> _init; | |
public RelayAutofacInitializer(IAutofacInitializer autofacInitializer, Action<ContainerBuilder> 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<ILifetimeScope> @delegate) | |
{ | |
using (var lifetimeScope = _container.BeginLifetimeScope(initializer.RegisterDependenciesForContainer)) | |
{ | |
initializer.InitializeUsingContainer(lifetimeScope); | |
@delegate(lifetimeScope); | |
} | |
} | |
public T Resolve<T>() | |
{ | |
return _container.Resolve<T>(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment