【问题标题】:Named Instances and a Default Instance in StructureMap?StructureMap 中的命名实例和默认实例?
【发布时间】:2013-05-23 11:25:10
【问题描述】:

在我的 StructureMap 引导代码中,我使用自定义约定来扫描程序集并将接口/实现对作为命名实例添加到对象图中。本质上,我有一些逻辑可以检查配置设置并根据各种条件深入到该语句:

registry.For(interfaceType).Use(type)
    .Named(implementationName);

这可以很好地添加所有命名实例。但是,如果未指定实例名称,我还想添加一个默认实例。但是,默认实例并不总是添加到图表中的最后一个。有时在扫描期间会添加其他命名实例。不过,无论是否命名,最后添加的实例似乎始终是默认值。

我尝试了多种 fluent API 组合,包括:

registry.For(interfaceType).Add(type);

或:

registry.For(interfaceType).Use(type);

甚至有些标记为已弃用。但结果行为始终是最后一个是默认行为。所以如果添加实现的顺序是这样的:

  1. 对于 Logger 接口,使用名为“Log4Net”的 Log4Net 实现
  2. 对于 Logger 接口,默认使用 Log4Net 实现
  3. 对于 Logger 接口,使用名为“Mock”的 Mock 实现

由此产生的行为是“Mock”实现在未指定名称时用作默认值。在容器中调试到AllInstances,我看到的顺序如下:

  1. 名为“Log4Net”的 Log4Net 记录器实例
  2. 一个带有 GUID 名称的 Log4Net 记录器实例(据我所知,与任何其他默认实例一样)
  3. 名为“Mock”的模拟记录器实例

但是,在没有实例名称的情况下从容器调用时调试到日志记录语句会导致使用 M​​ock 实现。

有没有办法将默认实例添加到对象图中,同时仍然能够在之后添加命名实例?

【问题讨论】:

    标签: c# .net dependency-injection ioc-container structuremap


    【解决方案1】:

    Add 方法将添加实例(如果您需要添加命名实例或添加多个实例以用于集合/枚举)。如果没有注册显式默认值(使用Use 方法),最后添加的实例将成为默认实例。 Use 方法用于设置默认实例。如果多次调用Use,最后注册的实例将成为默认实例。

    为了设置默认实例,然后注册更多命名实例,您应该能够这样做:

    registry.For(typeof(Logger)).Use(typeof(Log4Net)).Named("Log4Net");
    registry.For(typeof(Logger)).Add(typeof(Mock)).Named("Mock");
    

    这将使Log4Net 实例成为默认实例,并且也可以作为命名实例访问。 Mock 实例将作为命名实例提供。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      相关资源
      最近更新 更多