StructureMap и инъекция IEnumerable <T>

Я новичок в StructureMap и имею некоторый существующий код, с которым я работаю, который использует StructureMap 2.5.4.

Существует класс, построенный с использованием StructureMap, который имеет конструктор, который принимает IEnumerable в качестве параметра.

В реестре есть следующий код.

Scan(x =>
{
 x.TheCallingAssembly();
 x.WithDefaultConventions();
 x.AddAllTypesOf<icar>();
 }
);
ForRequestedType<ienumerable<icar>>().TheDefault.Is.ConstructedBy(
 x => ObjectFactory.GetAllInstances<icar>());
</icar></ienumerable<icar></icar>

Я пишу unit test и получаю вложенный контейнер с объекта ObjectFactory и ввел экземпляр с использованием метода Inject. Один из экземпляров ICar должен получить введенный тип в своем конструкторе. Однако он не работал, и я отслеживал это до вызова ObjectFactory.GetAllInstances(), который не использует мой вложенный контейнер.

Как я могу заставить это работать?

Я также читал о массивах autwiring StructureMap и экземплярах IEnumerable, но я не мог заставить его работать.

Есть ли лучший способ переписать указанный выше код реестра, чтобы создать экземпляр IEnumerable и использовать введенный тип из моего вложенного контейнера?

1 ответ

Если вы вставляете экземпляр во вложенный контейнер, вам нужно будет извлечь этот экземпляр из вложенного контейнера. Статический объект ObjectFactory имеет свой собственный контейнер, скорее всего, "родительский" контейнер в вашем случае. Родительский контейнер не наследует экземпляры из вложенных контейнеров.

Вам не нужно делать какую-либо конкретную регистрацию, чтобы все экземпляры были введены в класс, который принимает IEnumerable в своем конструкторе. StructureMap сделает это автоматически. Если у вас есть 3 экземпляра ICar, зарегистрированных в вашем контейнере, и запросите экземпляр Foo из этого контейнера, где Foo имеет параметр конструктора IEnumerable, Foo будет создан с тремя экземплярами ICAR, которые были введены.

licensed under cc by-sa 3.0 with attribution.