StructureMap并注入IEnumerable <T>

Gid*_*sey 7 .net structuremap dependency-injection 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>());
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能让它发挥作用?

我还读到了关于StructureMap自动装配数组和IEnumerable实例,但我无法让它工作.

有没有更好的方法来重写上面的注册表代码,以便IEnumerable<ICar>创建一个实例并使用我嵌套容器中的注入类型?

Jos*_*gan 7

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

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

  • 正确.对于2.6.1之前的版本,如果依赖项在构造函数中声明为数组(ICar []),则StructureMap将仅注入所有实例.在2.6.1中添加了对IEnumerable <T>的识别. (2认同)