【问题标题】:StructureMap and facadesStructureMap 和立面
【发布时间】:2011-06-09 12:59:32
【问题描述】:

我正在考虑为由 IoC 容器返回的应用程序的一部分定义一个外观,在我的例子中是 StructureMap。外观有一个不带参数的构造函数,用于设置默认实现,还有一个构造函数,因此我可以定义外观管理的不同子系统对象的自定义实现。

但是,由于 StructureMap 试图创建一个外观实例,调用具有最多参数的构造函数,如果没有注册其他子系统的实现,它就会失败。

我的问题是:如果 StructureMap 不能使用主构造函数,有什么方法可以告诉它尝试使用以下构造函数?还是我必须告诉 StructureMap 选择哪个构造函数?

【问题讨论】:

  • 也许一些示例代码将有助于一些可视化。
  • 如果可能,总是有一个带参数的构造函数。不要创建初始化类型的默认构造函数。这样你的类型仍然与具体的依赖关系紧密耦合,这使得交换变得困难。让 StructureMap 完成它的工作。
  • 只有一个带参数的构造函数,虽然仍然很少,但在这种情况下,大部分情况下都无法达到使用外观的目的。关于添加一些示例,我不知道是否真的需要,毕竟我的问题不需要太多代码。拥有一个具有多个构造函数的类,StructureMap 将选择第一个具有更多 if 参数的类,我想知道的是 StructureMap 是否可以以某种方式使用其他构造函数作为异常情况下的后备。

标签: .net ioc-container structuremap


【解决方案1】:

据我所知,如果没有最贪婪的成功,StructureMap 不可能尝试解析实例并回退到备用ctors。

我认为最好也使用 StructureMap 连接外观的依赖关系并在那里指定默认值。也许可以使用 Null 对象实现作为可能缺失的子系统的默认实现。

【讨论】:

  • 我也想过,但我想知道 StructureMap 是否能够做到我所要求的。我认为这将是一个很好的补充,不是吗?
【解决方案2】:

您可以指定一个委托来创建您的类型,如下所示:

container.Configure(r => r.For<IFacade>().Use(() => new RealFacade()));

【讨论】:

  • 好点,比我的解决方案好(为什么有种似曾相识的感觉)
  • 是的,我也知道这一点,尽管在这种情况下我更喜欢使用构造函数选择器。无论如何只是我个人的口味,因为我不知道它们是否有任何优点或缺点,也许这个其他选项更好,也许这口井可以成为其他线程的主题。
  • @Neverbirth:直接调用构造函数可能有缺点,具体取决于您使用的 DI 容器。例如,Simple Injector 不会对该类型进行任何后期初始化(使用RegisterInitializer 方法)。另一方面,StructureMap 可以(使用OnCreationForAll 方法)。据我所知,Unity 甚至没有这样的功能。无论哪种方式,当您向构造函数添加依赖项时,您都必须更改 DI 配置。这是明显的缺点。
猜你喜欢
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多