Skip to content

Instantly share code, notes, and snippets.

@jeremiahredekop
Created June 27, 2012 15:41
Show Gist options
  • Select an option

  • Save jeremiahredekop/3004915 to your computer and use it in GitHub Desktop.

Select an option

Save jeremiahredekop/3004915 to your computer and use it in GitHub Desktop.

Revisions

  1. jeremiahredekop created this gist Jun 27, 2012.
    87 changes: 87 additions & 0 deletions composite_root_helpers.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,87 @@
    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>();
    }
    }