Рассмотрим следующий код.
public interface IFoo { }
public class Bar
{
public Bar(IFoo[] foos) { }
}
public class MyModule : NinjectModule
{
public override void Load()
{
Bind<IFoo[]>().ToConstant(new IFoo[0]);
// ToConstant() is just an example
}
}
public class Program
{
private static void Main(string[] args)
{
var kernel = new StandardKernel(new MyModule());
var bar = kernel.Get<Bar>();
}
}
Когда я пытаюсь запустить программу, я получаю следующее исключение.
Ошибка активации IFoo
Нет подходящих привязок, и тип не является самопереключаемым.
Путь активации:
2) Инъекция зависимости IFoo в параметр foos конструктора типа Bar
1) Запрос на бар
Как я могу вставить/привязать к массиву в Ninject?
Спасибо за ваше время.
Edit:
Мое приложение импортирует данные, созданные сторонним компонентом.
В процессе импорта применяются различные фильтры (например, реализации различных интерфейсов фильтров). Правила фильтрации часто меняются, но слишком сложны для чистой конфигурации (и главного фильтра).
Я хочу, чтобы добавлять/редактировать фильтры как можно проще. У меня есть сборка, в которой находятся все реализации фильтра. Я попытался привязать каждый интерфейс фильтра к следующему методу (который предоставляет экземпляр каждой реализации этого типа фильтра). В основном я хочу избежать необходимости менять свой модуль Ninject при добавлении/удалении классов фильтров.
private IEnumerable<TInterface> GetInterfaceImplementations<TInterface>(IContext context)
{
return GetType().Assembly.GetTypes()
.Where(t => typeof (TInterface).IsAssignableFrom(t) && IsConcreteClass(t))
.Select(t => Kernel.Get(t)).Cast<TInterface>();
}
Я чувствую себя немного виноватым с точки зрения обхода механизма контейнеров DI. Это плохая практика? Существует ли обычная практика для таких целей?
Разрешение:
Я использую класс-оболочку в качестве предлагаемого bsnote.