Ninject автоматически внедряет несвязанные классы?
public class MyController : Controller
{
private MyClass _class;
public MyController(MyClass class)
{
this._class = class;
}
}
public class MyClass
{
// stuff
}
Мой Ninject подключен к классам внедрения, которые реализуют IController
(Controller
класс так и делает). Но я не связывал MyClass
ни к чему, пока Ninject
все еще вводит MyClass
в MyController
,
Наверное, мой вопрос: почему он вводит то, что я ни к чему не привязывал? Убегает ли Ninject найти класс с подписью MyClass
? Я предполагаю, что это поведение будет другим, если мой конструктор потребовал MyBaseClass
и у меня есть два класса в моей сборке, которые наследуются от MyBaseClass
?
1 ответ
В Ninject V1 ImplicitSelfBinding был параметром конфигурации верхнего уровня (по умолчанию установлено значение true IIRC).
В V2 неявное поведение самосвязывания, которое вы наблюдаете, более глубоко связано (хотя есть способы его выключения - как и большинство битов Ninject, оно очень детализировано и минимально). В V2 поведение по умолчанию состоит в том, что самосвязывания для конкретных типов всегда генерируются, если нет других привязок. Единственный раз, когда вы обычно делаете Bind<Concrete>().ToSelf()
настроить привязку, например, сделать .InSingletonScope()
,
Посмотрите этот ответ @Remo Gloor, чтобы узнать, как отключить его в V2+.
Пойдите и сделайте поиск в источнике прямо сейчас для ImplicitSelfBinding в этот момент - это гораздо проще для чтения, чем люди, которые клюют на это!
Также не забудьте взглянуть на Ninject.Extensions.Conventions
и тесты на ninject.org для организации неявного Bind()
из I*X*
в *X*
(Как намекал Стивен, Ninject не будет связываться самостоятельно, если вы измените MyClass
класс быть abstract
.)