Castle Windsor CollectionResolver: почему он не работает с вызовами Resolve? - PullRequest
7 голосов
/ 03 мая 2011

Я добавил CollectionResolver в качестве под-резольвера моего ядра Windsor, и он будет правильно внедрять наборы зависимостей от разрешенных объектов. То есть, если у меня есть

class X { public X(IComponent[] components) { ... } }
container.Register(/* lots of IComponents */);
container.Register(Component.For<X>());

аргумент components для конструктора создается правильно, когда я его разрешаю

container.Resolve<X>()

но если бы вместо этого я просто хотел получить список самих компонентов,

container.Resolve<IComponent[]>()

Я получаю исключение ComponentNotFound с жалобой на то, что я не зарегистрировал никаких компонентов для IComponent[]. Я нахожу эту асимметрию противоречивой, поскольку не уверен, почему ядро ​​должно действовать иначе, когда оно разрешает зависимости, которые оно обнаруживает в конструкторах / свойствах, по сравнению с тем, когда оно разрешает зависимости, которые его пользователь хотел бы разрешить.

Ответы [ 2 ]

8 голосов
/ 03 мая 2011

Явное деление для Resolve / ResolveAll связано с внутренними и неинтересными деталями реализации в контейнере. Преобразователь коллекции - это подсистема зависимостей , поэтому он работает только для зависимостей.

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

0 голосов
/ 03 мая 2011

Я предполагаю, что причина такого поведения заключается в том, что в инъекции конструктора или свойства Castle использует нотацию коллекции / массива в качестве индикатора того, что все реализации должны быть возвращены в коллекцию. В противном случае вам потребуется специальный интерфейс или атрибут, чтобы сказать это. И тогда вам придется явно ссылаться на сборки Касла везде.

Однако при разрешении непосредственно из контейнера вы фактически указываете тип, который необходимо разрешить, и вы можете быть намного более выразительным (используя API), и вы можете явно вызывать ResolveAll. Так что я думаю, что это был компромисс в дизайне - реализация IoC-контейнеров не так проста, потому что вы часто связаны с языковыми конструкциями.

...