Unity Application Block,继承注入

时间:2008-12-07 20:41:49

标签: c# unity-container

我在使用Unity应用程序块时遇到问题,我创建了一个名为Composition的基类。

每个Composition包含一个IUnityContainer,当我创建顶级对象UniversalComposition时,我想用UnityContainer初始化它。

从UniversalComposition创建的任何对象我想使用IUnityContainer.CreateChildContainer方法将子IUnityContainer注入其中。

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 个答案:

答案 0 :(得分:1)

我不认为这会通过注入工作,因为您在父实例中实现它,因为在实例化子对象之前父容器不存在。因此,您无法生成要注入的子容器。更好的方法是通过基类上的参数化构造函数注入父容器,然后在子类中注入两者。默认构造函数可以使用null调用参数化构造函数,参数化构造函数可以检测到这一点并创建一个容器(如果未指定)。为清楚起见,下面的示例已经过简化。

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();
    }

}