views:

745

answers:

2

Hi,

I am having a problem using the Unity Application Block, I have created a base class called Composition.

Each Composition contains a IUnityContainer, when i create the top level object UniversalComposition i want to initialize it with a UnityContainer.

Any object that gets created from the UniversalComposition I want to inject a child IUnityContainer into it, using the IUnityContainer.CreateChildContainer method.

class Program
{
    static void Main(string[] args)
    {
        UniversalComposition universe = new UniversalComposition();


    }
}

public class UniversalComposition : Composition
{
    // Everything that gets resolved in this container should contain a child container created by the this container

    public UniversalComposition()
    {
        this.Container.RegisterType<IService, Service>();
    }

    protected override IUnityContainer CreateContainer()
    {
        return new UnityContainer();
    }

}

public abstract class Composition
{
    protected IUnityContainer Container {get; private set;}

    public Composition()
    {
        this.Container = this.CreateContainer();
    }

    public TInstance Resolve<TInstance>()
    {
        return this.Container.Resolve<TInstance>();
    }

    protected abstract IUnityContainer CreateContainer();
}

public class Service : Composition, IService
{
    public Service(/* I want to inject a child Unity Container in here container.CreateChildContainer() */)
    {
    }
}

public interface IService { }
+1  A: 

I don't think this will work via injection as you have it implemented in the parent since the parent container doesn't exist until the child object is instantiated. Thus you have no way to generate the child container to inject. A better way would be to inject the parent container via a parameterized constructor on the base class, then inject both in the child class. The default constructor could call the parameterized constructor with null and the parameterized constructor could detect this and create a container if one isn't specified. The example below is simplified for clarity.

public abstract class BaseClass
{
    public IUnityContainer Container { get; protected set; }

    public BaseClass() : BaseClass(null) {}

    public BaseClass( IUnityContainer container )
    {
        this.container = container ?? this.CreateContainer();
    }

    public abstract IUnityContainer CreateContainer();
}

public class DerivedClass : BaseClass
{
    public IUnityContainer ChildContainer { get; private set; }

    public DerivedClass() : DerivedClass(null,null) {}

    public DerivedClass( IUnityContainer parent, IUnityContainer child )
        : BaseClass( parent )
    {
        this.ChildContainer = child ?? this.CreateChildContainer();
    }

    public IUnityContainer CreateContainer()
    {
         return new UnityContainer();
    }

    public IUnityContainer CreateChildContainer()
    {
         return this.Container.CreateChildContainer();
    }

}
tvanfosson
A: 

Thanks, how could i automatically inject the parent and child into the DerivedClass? I cannot simply mark it as being an [InjectionConstructor]

Cheers

Rohan

Rohan West