Это в значительной степени повторение ответа @ bsnote (который я + 1d), который может помочь понять, почему он работает таким образом.
Ninject (и другие структуры DI / addin) имеют два различных средства:
- понятие либо привязки к одной однозначной реализации службы (
Get
)
- Средство, которое позволяет получить набор услуг [которые затем программно выбирают один из или каким-либо образом объединяются) (
GetAll
/ ResolveAll
в Ninject)
В вашем примере кода используется синтаксис, связанный с 2. выше. (например, в MEF для пояснения обычно используют аннотации [ImportMany]
)
Мне нужно было бы посмотреть в примерах (посмотрите на источник - он очень короткий, чистый и понятный), чтобы найти обходной путь для этого.
Однако, как говорит @bsnote, один из способов рефакторинга вашего требования состоит в том, чтобы обернуть массив либо в контейнере, либо получить запрашиваемый вами объект (т. Е. Фабричный метод или конструкцию типа репозитория)
Вам также может быть полезно объяснить, каков ваш реальный случай - почему существует голый массив? Конечно, есть коллекция конструктов предметов, просящих заключить их в основу всего этого - этот вопрос, конечно, не поднимается?
РЕДАКТИРОВАТЬ: Существует несколько примеров сканирования в расширениях, которые, я думаю, могут атаковать многие вещи, которые вы пытаетесь сделать (В таких вещах, как StructureMap, такие вещи более интегрированы, что, очевидно, имеет плюсы и минусы).
В зависимости от того, пытаетесь ли вы достичь соглашения о конфигурации или нет, вы можете рассмотреть возможность установки интерфейса маркера на каждый тип плагина. Тогда вы можете явно Bind
каждый. В качестве альтернативы, для CoC вы можете сделать цикл Module
s Load()
для набора реализаций, которые вы генерируете (то есть, множество отдельных Get
s) при редактировании.
В любом случае, если у вас есть несколько регистраций, вы можете с радостью либо «запросить» T[]
или IEnumerable<T>
и получить полный набор. Если вы хотите достичь этого в явном виде (т. Е. Service Locator и все, что он подразумевает), как вы это делаете, вы можете использовать GetAll
для их пакетной обработки, чтобы не выполнять зацикливание, которое подразумевается в том, как вы это сделали это.
Не уверен, что вы установили это соединение или я что-то упустил. В любом случае, я надеюсь, что вас научили вставлять какой-то код в вопросы, поскольку он говорит> 1000 слов: P