Skip to content

Instantly share code, notes, and snippets.

@jeremiahredekop
Created June 27, 2012 15:41
Show Gist options
  • Save jeremiahredekop/3004915 to your computer and use it in GitHub Desktop.
Save jeremiahredekop/3004915 to your computer and use it in GitHub Desktop.
Composite Root Helpers
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