StructureMap并注入IEnumerable <t> </t>

时间:2011-01-12 04:49:30

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

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

有一个使用StructureMap构造的类,它有一个以IEnumerable<ICar>为参数的构造函数。

注册表包含以下代码。

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<ICar>的实例并使用嵌套容器中的注入类型?

1 个答案:

答案 0 :(得分:7)

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

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