Ninject автоматически внедряет несвязанные классы? - PullRequest
5 голосов
/ 02 октября 2010
public class MyController : Controller
{
   private MyClass _class;

   public MyController(MyClass class)
   {
       this._class = class;
   }
}

public class MyClass
{
      // stuff
}

My Ninject подключен к классам внедрения, которые реализуют IController (класс Controller делает это). Но я не связывал MyClass ни с чем, но Ninject все еще вводит MyClass в MyController.

Полагаю, мой вопрос: почему он вводит то, что я ни к чему не привязывал? Ninject запускает поиск класса с подписью MyClass? Я предполагаю, что это поведение будет другим, если мой конструктор потребует MyBaseClass, и у меня есть два класса в моей сборке, которые наследуются от MyBaseClass?

1 Ответ

8 голосов
/ 03 октября 2010

В Ninject V1 ImplicitSelfBinding был параметром конфигурации верхнего уровня (по умолчанию - true IIRC).

В V2 неявное поведение самосвязывания, которое вы наблюдаете, более тесно связано (хотя есть способыотключив его - как и большинство битов Ninject, это очень детально и минимально).В V2 поведение по умолчанию состоит в том, что самосвязывания для конкретных типов всегда генерируются, если нет других привязок.Единственный раз, когда вы обычно делаете Bind<Concrete>().ToSelf(), это настраиваете привязку, например, для .InSingletonScope().

См. Этот ответ @Remo Gloor , чтобы узнать, как это сделать.отключить в V2 +.

Пойдите, сделайте grep в источнике прямо сейчас для ImplicitSelfBinding в этот момент - это намного проще для чтения, чем люди, клевещущие на все же!

Также не забудьте взглянуть на Ninject.Extensions.Conventions и тесты на ninject.org для организации неявного Bind() преобразования I*X* в *X*

(Как упоминал Стивен, Ninject не будет самостоятельно связываться, если вы изменили свой класс MyClass наabstract.) * * тысяча двадцать-одна

...