在我的StructureMap引导代码中,我正在使用自定义约定来扫描程序集并将接口/实现对作为命名实例添加到对象图形中。基本上,我有一些逻辑来检查配置设置并根据各种条件钻取到此语句:
registry.For(interfaceType).Use(type)
.Named(implementationName);
这样做足以添加所有命名的实例。但是,如果没有指定实例名称,我也想添加一个默认实例。然而,默认实例并不总是添加到图形中的最后一个。有时在扫描期间会添加其他命名实例。但似乎无论最后添加哪个实例,无论是否命名,它始终是默认实例。
我尝试了各种流畅API的组合,包括:
registry.For(interfaceType).Add(type);
或者:registry.For(interfaceType).Use(type);
即使其中一些已被标记为弃用,但是其结果总是最后一个被视为默认值。因此,如果添加实现的顺序如下所示:
- 对于Logger接口,请使用名为“Log4Net”的Log4Net实现
- 对于Logger接口,请使用默认的Log4Net实现
- 对于Logger接口,请使用名为“Mock”的Mock实现
结果行为是,当未指定名称时,将使用“Mock”实现作为默认值。在容器中调试AllInstances
,我按以下顺序看到:
- 名为“Log4Net”的Log4Net日志记录器的实例
- 具有GUID名称(与其他默认实例一样,据我所知)的Log4Net日志记录器的实例
- 名为“Mock”的Mock日志记录器的实例
然而,在不带实例名称的情况下从容器调用日志记录语句进行调试会导致使用Mock实现。
是否有一种方法可以在对象图中添加默认实例,同时仍然能够之后添加具有名称的实例?