在我的StructureMap引导代码中,我使用自定义约定来扫描程序集,并将接口/实现对作为命名实例添加到对象图中。基本上我有一些逻辑可以检查配置设置,并根据不同的条件深入到这个语句:
registry.For(interfaceType).Use(type)
.Named(implementationName);
这样可以很好地添加所有命名实例。但是,我还想在未指定实例名称的情况下添加默认实例。但是,默认实例并不总是添加到图表中的最后一个实例。有时在扫描期间会添加其他命名实例。但是,似乎最后添加的任何一个实例,无论它是否被命名,都始终是默认值。
我尝试了各种流畅的API组合,包括:
registry.For(interfaceType).Add(type);
或:
registry.For(interfaceType).Use(type);
甚至有些被标记为已弃用。但最终的行为始终是最后一个是默认行为。因此,如果添加实现的顺序是这样的:
结果是,在未指定名称时,“Mock”实现将用作默认值。调试到容器中的AllInstances
,我按以下顺序看到:
从没有实例名称的容器调用时调试到日志语句会导致使用Mock实现。
有没有办法在对象图中添加默认实例,但之后仍能添加命名实例?
答案 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
实例将作为命名实例提供。