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 { }
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.