Инъекция класса с несколькими конструкторами - PullRequest
1 голос
/ 26 марта 2010

Разрешение класса с несколькими конструкторами с помощью NInject не работает.

public class Class1 : IClass
{
public Class1(int param) {...}
public Class1(int param2, string param3) { .. }
}

следующее не работает:

IClass1 instance =
    IocContainer.Get<IClass>(With.Parameters.ConstructorArgument(“param”, 1));

Хук в модуле прост и работал до того, как я добавил дополнительный конструктор: . Bind () К ();

Ответы [ 2 ]

5 голосов
/ 26 марта 2010

Причина, по которой он не работает, заключается в том, что аргументы .ctor, введенные вручную, не учитываются в процессе выбора .ctor. .Ctors оцениваются в зависимости от того, сколько у них параметров, и для какого типа параметра существует привязка. Во время активации применяются предоставленные вручную аргументы .ctor. Поскольку у вас нет привязок для int или string, они не оцениваются. Вы можете форсировать подсчет очков, добавив атрибут [Inject] к .ctor, который вы хотите использовать.

4 голосов
/ 11 мая 2013

Проблема, с которой вы столкнулись, состоит в том, что Ninject выбирает .ctors на основе количества доступных ему связанных параметров. Это означает, что Ninject принципиально не понимает перегрузки.

Вы можете обойти эту проблему, используя функцию .ToConstructor () в своих привязках и комбинируя ее с функцией .Named (). Это позволяет создавать несколько привязок для одного и того же класса к разным конструкторам с разными именами. Это немного глупо, но это работает.

Я веду свой собственный блог по разработке программного обеспечения, так что в конечном итоге это была его публикация. Если вам нужен пример кода и немного больше объяснений, вы должны проверить его.

http://www.nephandus.com/2013/05/10/overloading-ninject/

...