我有使用Unity应用程序块中的问题,我已经创建称为组合物的基类。

每个组合物含有IUnityContainer,当我创建的顶层对象UniversalComposition我想用UnityContainer进行初始化。

,但未通过UniversalComposition创建的任何对象欲注入子IUnityContainer进去,使用IUnityContainer.CreateChildContainer方法。

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 { }
有帮助吗?

解决方案

我不认为这会通过注射工作,因为你拥有了它的母公司实现的,因为不存在父容器,直到孩子对象实例化。因此,你没有办法生成子容器注入。更好的办法是通过在基类中的参数的构造函数注入父容器,那么无论是在子类注入。默认的构造函数可以调用与空和参数的构造函数的参数的构造函数可以检测到这一点,如果没有指定一个是创建一个容器。下面的例子是为了清楚而简化。

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

}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top