【问题标题】:StructureMap Specifying Explicit Constructor ArgumentsStructureMap 指定显式构造函数参数
【发布时间】:2011-10-27 14:41:12
【问题描述】:

我正在处理遗留代码。

我有同一个类的不同方法,它们将不同的参数传递给依赖项的构造函数。我正在尝试介绍一些基本的 IoC 用法。现在我有 StructureMap 像这样传递我的参数:

var thing = ObjectFactory.GetInstance<IThingInterface>(new ExplicitArguments(
      new Dictionary<string, object> { 
          { "constructorArgA", notShown  }, 
          { "constructorArgB", redacted.Property } }));

为 constructorArgA 和 B 传递的实际属性根据我所在的位置而变化。

有一种方法可以通过实际类型来配置它,而不是“constructorArgA”,就像你在配置 objectFactory 时可以做的那样,比如:

x.For<IHidden>().Use<RealType>()
   .Ctor<IConfig>().Is(new Func<IContext, IConfig>(
        (context) => someMethodToGetIConfig()));

如果我从头开始编写此代码,我可能会构建一些不同的依赖关系以避免这种情况,但这不是我现在的选择。

【问题讨论】:

  • 或者我应该切换到属性注入而不是构造函数注入?

标签: inversion-of-control ioc-container structuremap


【解决方案1】:

这是关于 DI 容器的经典/常见问题。

我的第一选择是创建一个“手动”抽象工厂来创建 IThingInterface,然后使用 Structuremap 在需要的地方注入 IThingInterfaceFactory。通过手动工厂,我的意思是一个调用 new ThingInterface() 并返回它的类。如果你这样做,你的实现将不再是容器管理的,如果 it 有依赖项,它们将不再由容器提供(对你来说可能是也可能不是问题) .

第二个选择是创建一个实际使用/包装容器的抽象工厂。所以基本上你的第一个代码 sn-p 但包装在一个工厂类中,其中 Create() 方法接受你的参数。这样做的好处是所有内容(包括您的实现及其依赖项)都由容器管理,但缺点是直接引用您的容器(这不是最佳实践——请参阅Article on Composition Roots)。

您也可以进行 setter 注入,但我个人认为这是最后的手段。

Castle Windsor 内置 (Typed Factory Facility) 很好地解决了这个问题。不确定是否在选项中切换容器,但您可能会考虑它。

【讨论】:

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