2010-03-26 4 views
1

Устранение класса, имеющего несколько конструкторов с 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() К();

+3

Не делать DI с перегруженными конструкторами. Он вводит нежелательную двусмысленность: http://stackoverflow.com/questions/2470102/how-does-unity-resolve-know-which-constructor-to-use/2470404#2470404 –

ответ

5

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

4

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

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

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

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

Смежные вопросы