Используйте 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.

0 ответов

Другие вопросы по тегам