【问题标题】:StructureMap and injecting IEnumerable<T>StructureMap 和注入 IEnumerable<T>
【发布时间】:2011-06-07 14:49:12
【问题描述】:

我是 StructureMap 的新手,我正在处理一些使用 StructureMap 2.5.4 的现有代码。

有一个使用 StructureMap 构造的类,它有一个以IEnumerable&lt;ICar&gt; 作为参数的构造函数。

注册表有以下代码。

Scan(x =>
{
   x.TheCallingAssembly();
   x.WithDefaultConventions();
   x.AddAllTypesOf<ICar>();
   }
);

ForRequestedType<IEnumerable<ICar>>().TheDefault.Is.ConstructedBy(
            x => ObjectFactory.GetAllInstances<ICar>());

我正在编写一个单元测试,并从 ObjectFactory 获得了一个嵌套容器,并使用 Inject 方法注入了一个实例。 ICar 的实例之一应该在其构造函数中接收注入的类型。但是它不起作用,我将其追踪到不使用我的嵌套容器的 ObjectFactory.GetAllInstances() 调用。

我怎样才能让它工作?

我还阅读了有关 StructureMap 自动装配数组和 IEnumerable 实例的信息,但我无法让它工作。

是否有更好的方法来重写上述注册表代码,以便创建IEnumerable&lt;ICar&gt; 的实例并使用我嵌套容器中的注入类型?

【问题讨论】:

  • 在某些地方您使用TCar,而在其他地方您使用ICar。它们的关系是什么(StructureMap 是否知道它们的关系)?
  • 对不起,它们是同一个东西.. 错字。

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


【解决方案1】:

如果您将实例注入到嵌套容器中,则需要从嵌套容器中检索该实例。静态 ObjectFactory 有自己的容器,在您的情况下可能是“父”容器。父容器不继承嵌套容器的实例。

您无需进行任何特定注册即可将所有实例注入到在其构造函数中接受IEnumerable 的类中。 StructureMap 将自动执行此操作。如果您在容器中注册了 3 个 ICar 实例,并从该容器请求 Foo 实例,其中 Foo 具有 IEnumerable&lt;ICar&gt; 构造函数参数,则将创建 Foo 并注入 3 个 ICar 实例。

【讨论】:

  • 是的,我认为 ObjectFactory 有它自己的容器,因此ObjectFactory.GetAllInstances&lt;ICar&gt;() 调用看不到注入的类型,我只需要知道如何重写那行代码,以便注入的类型是可见的。
  • 我尝试删除 ForRequestedType&lt;IEnumerable&lt;ICar&gt;&gt;().TheDefault.Is.ConstructedBy(x =&gt; ObjectFactory.GetAllInstances&lt;ICar&gt;()); 行,但出现以下异常:StructureMap Exception Code: 202 No Default Instance defined for PluginFamily IEnumerable&lt;ICar&gt;。根据您所说,我认为 x.AddAllTypesOf&lt;ICar&gt;(); 行将注册 ICar 的所有实例,并且 IEnumerable 参数将提供给请求类型的构造函数。知道为什么这不能正常工作吗?
  • 好的,我搞定了。我必须更新项目以使用最新版本的 StructureMap。版本 2.5.4 的行为与您描述的不同,但 2.6.1 会。我还删除了ForRequestedType&lt;IEnumerable&lt;ICar&gt;&gt;().TheDefault.Is.ConstructedBy( x =&gt; ObjectFactory.GetAllInstances&lt;ICar&gt;()); 行,并且能够从我的嵌套容器中获取注入的实例。
  • 正确。对于 2.6.1 之前的版本,只有在构造函数中将依赖项声明为数组 (ICar[]) 时,StructureMap 才会注入所有实例。 2.6.1 中添加了对 IEnumerable 的识别。
猜你喜欢
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
相关资源
最近更新 更多