我在使用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 { }
答案 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();
}
}