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.)

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