【问题标题】:Unity Application Block, inherited injectionUnity Application Block,继承注入
【发布时间】:2008-12-07 20:41:48
【问题描述】:

我在使用 Unity 应用程序块时遇到问题,我创建了一个名为 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 { }

【问题讨论】:

    标签: c# unity-container


    【解决方案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();
        }
    
    }
    

    【讨论】:

    • 谢谢,我怎样才能自动将父母和孩子注入到 DerivedClass 中?我不能简单地将其标记为[InjectionConstructor]
    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2015-11-25
    • 2011-11-12
    • 2021-11-08
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    相关资源
    最近更新 更多