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”的Mock实现

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

  1. 名为“Log4Net”的Log4Net记录器实例
  2. Log4Net记录器的一个实例,带有名称的GUID(就像我可以告诉的那样,任何其他默认实例)
  3. Mock记录器的一个实例名为“Mock”

但是,从没有实例名称的容器调用时调试到日志记录语句会导致使用Mock实现。

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

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

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

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

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