Внедрение в конструктор с помощью Func on Ninject - PullRequest
2 голосов
/ 25 февраля 2012

Я использую модуль Ninject для привязки различных типов к соответствующим интерфейсам.

Инъекция будет происходить внутри конструктора класса. Проблема в том, что у класса есть другой конструктор с сигнатурой, включая Func.

Ninject смущен и бросает это в меня:

Ошибка активации ClassTest с использованием неявного самосвязывания ClassTest. Несколько конструкторов имеют одинаковый приоритет. Пожалуйста, укажите конструктор с использованием синтаксиса ToConstructor или добавьте атрибут Inject.

Смотрите ниже, как выполняется связывание и как я делаю инъекцию:

this.Bind<InterfaceA>().To<ClassA>();
...

public class ClassTest
{
    public ClassTest(InterfaceA a)
    {
    }

    public ClassTest(Func<ClassB> funcB)
    {
    }
}

...
var giveMeTest = kernel.Get<ClassTest>(); // exception thrown
}

Кажется, что здесь виноват Функ, не могли бы вы объяснить, почему Нинжект запутался?

Спасибо

1 Ответ

8 голосов
/ 25 февраля 2012

Лучше всего вы удалите все неиспользуемые конструкторы. Нет причин добавлять конструкторы, которые никогда не используются. Если вам действительно нужно несколько конструкторов, вам нужно указать Ninject, какой из них выбрать, например ::1001

Bind<ClassTest>().ToConstructor(x => new ClassTest(x.Inject<InterfaceA>())).Named("A");
Bind<ClassTest>().ToConstructor(x => new ClassTest(x.Inject<Func<ClassB>>())).Named("B");

kernel.Get<ClassTest>("A");
kernel.Get<ClassTest>("B"); 
...