Используйте NInject для инициализации нескольких коллекций
Я заранее прошу прощения, если это глупый вопрос: я новичок в NInject.
Мне нужно инициализировать мое приложение несколькими коллекциями, каждая из которых имеет несколько одинаковых объектов. Без IoC это будет выглядеть так:
public ICollection<ICollection<IBusinessObject>> Piles = new ICollection<ICollection<IBusinessObject>>();
public MyCollectionContainer()
{
Piles.Add(new List<IBusinessObject>({ new ObjectA(), new ObjectA() });
Piles.Add(new List<IBusinessObject>({ new ObjectB(), new ObjectB() });
Piles.Add(new List<IBusinessObject>({ new ObjectC(), new ObjectC() });
}
Я хотел бы поручить NInject сделать эту работу для меня, чтобы позвонить Kernel.Get<MyCollectionContainer>()
будет делать ту же работу, что и выше, с некоторой дополнительной гибкостью, конечно.
Другими словами, я хочу в связанное время проинструктировать NInject
Kernel.Bind<ICollection<ICollection<IBusinessObject>>>().To< /* A list of 3 */>();
Kernel.Bind<IList<IBusinessObject>>().To< /* A List of 2 IBusinessObject */>();
Kernel.Bind<IBusinessObject>().To< /* a different type depending on the container */>();
Дополнительный вопрос: лучше ли мне использовать Kernel.Get<MyCollectionContainer>()
или же Kernel.Get<ICollection<ICollection<IBusinessObject>>>()
РЕДАКТИРОВАТЬ: при поиске решения я попытался определить пользовательскую привязку для моих коллекций в модели
Kernel.Bind<IList<IBusinessObject>>()
.ToConstructor(x => new List<IBusinessObject>(
x.Inject<IList<IBusinessObject>>())
);
С методом расширения IConstructorArgumentSyntax.InjectMany(int i)
:
Kernel.Bind<IList<IBusinessObject>>().To<ObjectA>();
Kernel.Bind<IList<IBusinessObject>>()
.ToConstructor(x => new List<IBusinessObject>(
x.InjectMany<IList<IBusinessObject>>(2))
);
public static T InjectMany<T>(this IConstructorArgumentSyntax x, int numberOfInjections)
{
/* loop */
{
x.Inject<T>();
}
}
К сожалению, NInject отказывается вызывать x.Inject(); жалуясь, что я слишком глубоко погрузился в их магию
System.InvalidOperationException :
This method is for declaration that a parameter shall
be injected only! Never call it directly.