StructureMap и внедрение IEnumerable <T> - PullRequest
7 голосов
/ 12 января 2011

Я новичок в 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 и внедрил экземпляр, используяВнедрить метод.Один из экземпляров ICar должен получить внедренный тип в своем конструкторе.Однако это не сработало, и я отследил это до вызова ObjectFactory.GetAllInstances (), который не использует мой вложенный контейнер.

Как мне заставить это работать?

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

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

1 Ответ

7 голосов
/ 12 января 2011

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

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

...