Регистрация нескольких сопоставлений одного и того же типа поиска в StructureMap для внедрения в конструктор - PullRequest
2 голосов
/ 21 августа 2010

Таким образом, у меня есть ситуация, когда я хочу зарегистрировать n отображений определенного типа поиска.IE:

x.For<IWidget>().Add<SquareWidget>();
x.For<IWidget>().Add<YellowWidget>();

И я хочу, чтобы SM вставил их (или массив) в конструктор класса:

public class Machine
{
    public Machine(IEnumerable<IWidget> widgets) { ... }
}

ObjectFactory.GetInstance<Factory>()

Я не вижу способасделайте это, но я могу что-то упустить.

TIA,

m

PS: Пожалуйста, не отвечайте: «Почему вы делаете это так» илидругие не относящиеся к делу комментарии.Я понимаю, что это может быть достигнуто с использованием других подходов.Мне действительно просто любопытно, возможен ли такой конкретный подход.:)

Ответы [ 2 ]

7 голосов
/ 21 августа 2010

С более свежими версиями StructureMap (которые распознают IEnumerable), он должен работать именно так, как у вас есть в вопросе.Просто зарегистрируйте несколько конкретных типов, используя For (). Add (), а затем поместите IEnumerable типа интерфейса в качестве параметра конструктора.StructureMap автоматически внедрит все зарегистрированные конкретные типы.Нет необходимости использовать специальный регистрационный код, например, TheArrayOf ...

3 голосов
/ 21 августа 2010

Если бы в конструкторе был массив IWidgets, то SM добавлял бы все IWidget при создании новой машины, так как я считаю, что это поведение по умолчанию.

Для вставки определенного массива:

For<IMachine>()
    .TheDefault.Is.OfConcreteType<Machine>()
    .TheArrayOf<IWidget>().Contains(
            x => {
                x.OfConcreteType<SquareWidget>();
                x.OfConcreteType<YellowWidget>();
                x.OfConcreteType<BadWidget>();
            });

или, для IEnumerable:

For<IMachine>()
    .TheDefault.Is.OfConcreteType<Machine>()
    .CtorDependency<IEnumerable<IMachine>>().Is(i => {
        i.Is.ConstructedBy(c => {
            return new List<ITask> { 
                x.OfConcreteType<SquareWidget>();
                x.OfConcreteType<YellowWidget>();
                x.OfConcreteType<BadWidget>();
                };
             });
     });

Вероятно, есть способ сделать это последним без необходимости быть конкретным, но мой разум колеблется. :)

О, и инъекционная магия тоже была бы возможна.

...