我是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>
的实例并使用嵌套容器中的注入类型?
答案 0 :(得分:7)
如果要将实例注入嵌套容器,则需要从嵌套容器中检索该实例。静态ObjectFactory有自己的容器,可能是你的情况下的“父”容器。父容器不会从嵌套容器继承实例。
您无需进行任何特定注册即可将所有实例注入到其构造函数中接受IEnumerable
的类中。 StructureMap将自动执行此操作。如果在容器中注册了3个ICar实例,并从该容器请求Foo实例,其中Foo具有IEnumerable<ICar>
构造函数参数,则将创建Foo,并注入3个ICar实例。