StructureMap中的命名实例和默认实例?

时间:2013-05-28 13:08:25

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

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

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

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

我尝试了各种流畅的API组合,包括:

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

或:

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

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

  1. 对于Logger接口,请使用名为“Log4Net”的Log4Net实现
  2. 对于Logger界面,默认情况下使用Log4Net实现
  3. 对于Logger接口,请使用名为“Mock”
  4. 的Mock实现

    结果是,在未指定名称时,“Mock”实现将用作默认值。调试到容器中的AllInstances,我按以下顺序看到:

    1. 名为“Log4Net”的Log4Net记录器实例
    2. Log4Net记录器的一个实例,其中包含名称的GUID(就像我可以告诉的任何其他默认实例一样)
    3. 名为“Mock”的模拟记录器的实例
    4. 从没有实例名称的容器调用时调试到日志语句会导致使用Mock实现。

      有没有办法在对象图中添加默认实例,但之后仍能添加命名实例?

1 个答案:

答案 0 :(得分:22)

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

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

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

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