Вы можете использовать механизм Ninject Load
, чтобы получить экспортированные классы в микс, и вы можете либо:
kernel.GetAll<IMyInterface>()
Создание лениво (т. Е. Каждый имплIMyInterface
создается на лету, когда вы выполняете итерацию вышеупомянутого) IIRC, но посмотрите на тесты в источнике (который очень чистый и читаемый, у вас нет оправдания: P)будьте уверены.
Если вам не нужна лень, используйте LINQ ToArray
или ToList
, чтобы получить IMyInterface[]
или List<IMyInterface>
, или вы можете использовать низкий уровень Resolve()
семейство методов (опять же, посмотрите в тестах на образцы), чтобы получить подходящие сервисы [если вы хотите выполнить некоторую фильтрацию или что-то иное, чем просто использование экземпляра - хотя связывание метаданных, вероятно, и есть решение)
Наконец, если вы можете редактировать объяснение того, нужна ли вам лень как таковая или вы делаете это, чтобы проиллюстрировать точку зрения.(и поиск для Lazy<T>
здесь и в целом по Ninject и autofac для некоторых образцов - не могу вспомнить, если есть какие-либо примеры в источнике - не думайте, что он все еще на 3.5)
РЕДАКТИРОВАТЬ: Вв этом случае вы хотите привязку, которая имеет:
Bind<X>().To<>().In...().Named( "x" );
в регистрациях в ваших модулях в дочерней сборке.
Затем, когда вы решаете в родительской сборке, вы используетеПерегрузка Kernel.Get<>
, которая принимает параметр name
, чтобы указать тот, который вам нужен (нет необходимости в лени, массивах или IEnumerable
).Механизм Named
является специфическим (только одно или два вспомогательных расширения реализуют его с точки зрения обобщенной концепции) применения концепции метаданных привязки в Ninject - есть много возможностей для его настройки, если чего-то помимо простого имени недостаточно.
Если вы используете MEF для создания объектов, вы можете использовать механизм Kernel.Inject()
для ввода свойств.Проблема в том, что либо MEF, либо Ninject - должны найти типы (Ninject: обычно через Bind()
через Module
s или через расширения сканирования, после чего можно сделать Resolve
для подстановки привязок перед созданием экземпляра - хотя этоэто не то, что вы обычно делаете) - должен создавать экземпляры типов (Ninject: обычно через Kernel.Get()
, но если вы обнаружили типы с помощью, например, MEF, вы можете использовать Kernel.Get(Type)
перегрузки ) - долженвпрыскивать типы (Ninject: обычно через Kernel.Inject()
или неявно в `Kernel.Get ())
Что мне еще не ясно, так это то, почему вы чувствуете, что вам нужно смешивать и манипулировать этими двумя - в конечном итогеРазделение обязанностей во время конструирования и внедрения конструктора не является основным вариантом использования ни для одной из библиотек, даже если они обе являются достаточно компоноваемыми библиотеками.У вас есть ограничения, или у вас есть важные преимущества с обеих сторон?