【问题标题】:Unity constructor injection with implied names具有隐含名称的 Unity 构造函数注入
【发布时间】: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


【解决方案1】:

我同意 cmets 关于共享界面的看法。 IOC 的全部意义在于您的引擎不需要知道要使用哪个实现。应该只给它接口。

解决这个问题的一种方法是允许 Unity 注入一个接口数组:

public TrackerEngine(ITrackerSection[] trackerSections) { }

这样你可以同时注入。但是,如果你真的需要知道哪个接口是哪个,你可以在你的接口中实现一个枚举或其他东西。像这样的:

public interface ITrackerSection {
   SectionType Section { get; }
}

public enum SectionType{
   0 = Scope,
   1 = Sample
}

在你的实现中:

public class ScopeTrackerSection : ITrackerSection {
   // Do your stuff...

   public SectionType Section {
      get { return SectionType.Scope; }
   }
}

public class SampleTrackerSection : ITrackerSection {
   // Do your stuff...

   public SectionType Section {
      get { return SectionType.Sample; }
   }
}

在您的引擎中,您可以获取所需操作所需的接口。

public TrackerEngine(ITrackerSection[] trackerSections) {
  var scopeTrackerSection = trackerSections.FirstOfDefault(x => x.Section == SectionType.Sample);

// Do something with scopeTrackerSection

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多