我有以下问题。我有两个类T1和T2都实现接口T.我喜欢T2来装饰T1所以当我创建T T2的实例时,先调用T1,然后是T1。
public class T1 : IT
{
public void Call()
{
Write("T1");
}
}
public class T2 : IT
{
private IT _t;
public T2(ISomeOther other, IT t)
{
_t = t;
}
public void Call()
{
Write("T2");
_t.Call();
}
}
public interface T {
void Call();
}
我的团结如下:
var unityContainer = new UnityContainer();
unityContainer.RegisterType<ISomeOther>(new Other());
unityContainer.RegisterType<T>(new T1());
unityContainer.RegisterType<T, T2>(new InjectionConstructor(new ResolvedParameter<ISomeOther>(), new ResolvedParameter<T2>());
我希望避免明确说明ResolvedParameters - Unity中的整个目的是删除此类工作。我想告诉Unity T2装饰T1,并让Unity解析参数。我喜欢我的最后一行代码,希望看起来像这样:
unityContainer.RegisterType<T, T2>().Decorates<T1>();
在Unity这样的事情是否可行?还有其他更好的IoC容器吗?
请注意,这是一个简化示例,因此任何次要语法错误都是偶然的。
编辑:
这不是How do I use the Decorator Pattern with Unity without explicitly specifying every parameter in the InjectionConstructor的重复 - 我不想显着地创造装饰或列出相关性。像这样:
_container.Register<IT, T1>();
_container.Decorate<IT, T2>();
_container.Decorate<IT, T3>();
T1,T2和T3在构造函数中可能有各种依赖关系 - 我不想列出这些依赖项,我希望IoC容器为我解决这些问题(否则为什么要使用IoC容器?)
答案 0 :(得分:1)
在Ninject中有非常有用的功能:
Bind<T>().To<T1>().WhenInjectedInto(typeof(T2));
它将在构造函数中使用T1的实例初始化T2。希望我理解你。 但是,我真的很感兴趣,如果在Unity中有这样的事情,因为它也是我的主要IoC容器。