【发布时间】:2014-02-14 15:01:59
【问题描述】:
我试图将两个类注入到我的构造函数中,问题是它们都是同一个接口。我的注册是:
container.RegisterType<ITrackerSection, ScopeSection>();
container.RegisterType<ITrackerSection, SampleSection>();
如您所见,它们都是 ITrackerSection 类型,但实现方式不同。我的构造函数如下所示:
public TrackerEngine(ITrackerSection scopeSection, ITrackerSection sampleSection)
这两个参数都作为 sampleSection 注入,因为它是最后一次为接口类型注册的。例如,我对注册类型的命名没有问题
container.RegisterType<ITrackerSection, ScopeSection>("scopeSection");
container.RegisterType<ITrackerSection, SampleSection>("sampleSection");
但这现在意味着我必须指定类参数,这看起来很混乱,并且当 unity 能够解决它们时添加依赖项。此外,TrackerEngine 的注册也需要指定参数。我知道我可以在 TrackerEngine 的构造函数中使用内联属性,但我更喜欢 Unity 通过名称推断对象。
Unity(我似乎无法正常工作)能否仅根据构造函数中参数的名称正确注入接口的正确实现?所以 ITrackerSection scopeSection 与注册 ScopeSection 时给出的名称相同,因此请使用该类型。
【问题讨论】:
-
为什么这两个类实现了相同的接口?你的设计似乎模棱两可。如果你给他们每个人自己的界面,你所有的问题都没有了。
-
创建特定于每种类型的接口似乎是一种反模式。该接口定义了所有这些部分都需要具有的结构。 IScopeSection : ITrackerSection 似乎是解决不应该存在的问题的额外代码
-
歧义也是一种反模式。
标签: c# dependency-injection inversion-of-control unity-container