Unity中的装饰器有很多参数

时间:2015-05-06 14:17:20

标签: c# .net asp.net-web-api inversion-of-control unity-container

我有以下问题。我有两个类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容器?)

1 个答案:

答案 0 :(得分:1)

在Ninject中有非常有用的功能:

Bind<T>().To<T1>().WhenInjectedInto(typeof(T2));

它将在构造函数中使用T1的实例初始化T2。希望我理解你。 但是,我真的很感兴趣,如果在Unity中有这样的事情,因为它也是我的主要IoC容器。