在StructureMap中,有命名实例和默认实例吗?

12

在我的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. 具有GUID名称(与其他默认实例一样,据我所知)的Log4Net日志记录器的实例
  3. 名为“Mock”的Mock日志记录器的实例

然而,在不带实例名称的情况下从容器调用日志记录语句进行调试会导致使用Mock实现。

是否有一种方法可以在对象图中添加默认实例,同时仍然能够之后添加具有名称的实例?

1个回答

26
Add方法将添加实例(如果您需要添加具有名称的实例或添加多个实例以在集合/枚举中使用)。如果没有显式的默认值被注册(使用Use方法),最后添加的实例将成为默认实例。Use方法用于设置默认实例。如果多次调用Use,则最后注册的实例将成为默认实例。
为了设置默认实例,然后注册更多命名实例,您应该像这样做:
registry.For(typeof(Logger)).Use(typeof(Log4Net)).Named("Log4Net");
registry.For(typeof(Logger)).Add(typeof(Mock)).Named("Mock");

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接