【问题标题】:Decorators in Unity with many argumentsUnity 中带有许多参数的装饰器
【发布时间】:2015-05-06 14:17:19
【问题描述】:

我有以下问题。我有两个类 T1 和 T2 都实现了接口 T。我希望 T2 来装饰 T1,所以当我创建 T 的实例时,首先调用 T2,然后调用 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 容器?)

【问题讨论】:

  • 您的意思是用 T1 的实例初始化 T2 吗?在您的示例中几乎没有混淆(InjectionConstructor 将 T2 作为 T 而不是 T1 的实现?)。
  • 是的,应该先调用 T2,然后再调用 T1。 T2 应该装饰 T1,如果需要添加服务。我更新了代码以显示 T2 在 T1 上调用方法(针对接口进行编码)。在实践中,其中几个可能被链接在一起。
  • 查看这个答案,它定义了一个替代 InjectionConstructor 以允许您指定构造函数参数的子集,它会找出其余的:stackoverflow.com/a/22030760/1370166
  • 内置的InjectionConstructor 可以,但该答案中定义的自定义RequiredInjectionConstructor 没有。

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


【解决方案1】:

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

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

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

【讨论】:

  • 问题给出了答案:使用 InjectionConstructor。 NInject 语法更简洁,但功能相同。 stackoverflow.com/questions/5004306/…
  • Ninject 在工作时看起来不错,但它似乎非常复杂且文档记录不充分。启动和运行 Web API 应用程序是一场配置噩梦。
  • 我放弃了 Ninject,因为它非常慢。由于其性能,它在任何基准测试中都处于非常非常低的位置。这就是我现在使用 Unity 的原因,可惜我们没有开箱即用的 WhenInjectedInto...
猜你喜欢
  • 2014-07-21
  • 1970-01-01
  • 2018-01-07
  • 2022-12-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多