Как Ninject создает контроллер в ASP.NET MVC?

Это может быть глупый вопрос, но я смотрю на источники Ninject и не вижу, чтобы NInject регистрировал свой собственный контроллер factory. Я также не вижу класса IControllerFactory в сборке Ninject.Web.Mvc. Я что-то упускаю? Как Ninject создает контроллер и вводит параметры в конструктор?

Ответ 1

  • Предположим, что мы ищем "/Задача/Индекс".
  • Приложения Ninject MVC теперь используют DefaultControllerFactory, то же самое, что и приложения, отличные от Ninject.
  • DefaultControllerFactory находит тип для контроллера (TaskController).
  • DefaultControllerFactory имеет внутренний класс, называемый DefaultControllerActivator. DefaultControllerActivator имеет метод под названием Create, который возвращает экземпляр контроллера. DefaultControllerFactory запрашивает DefaultControllerActivator для экземпляра типа TaskController.
  • DefaultControllerActivator.Create использует IDependencyResolver. Здесь находится Ninject. Поскольку Ninject реализует свой собственный резольвер и устанавливает его в начале приложения, он получает запрос для экземпляра TaskController.
  • Остальное легко. Ninject находит конструктор для этого типа, вводит параметры, возвращает экземпляр контроллера.

Ответ 2

MVC3 теперь рекомендует использовать интерфейс IDependencyResolver вместо старого старого IControllerFactory при работе с DI. Вы можете подробнее ознакомиться с этим интерфейсом здесь.

Это новый класс Ninject, ответственный за инъекцию зависимостей.

Ответ 3

Поскольку контроллеры являются конкретными типами, Ninject будет выполнять самообслуживание. Ниже приведен фрагмент из ninject.complex.com

Имейте в виду, что только конкретные типы могут быть связаны самими собой; Абстрактные типы и интерфейсы не будут работать. Кроме того, если вы запрашиваете экземпляр тип, который может быть привязан к себе, и нет привязок, определенных для type, Ninject автоматически создаст неявное самообъявление. Это до вас, хотите ли вы явно определить свои привязки или позволить Ninject это понять.

Если вам нужно ввести параметры в конструктор. Вы можете создать класс, наследуемый от INinjectModule, и выполнить привязку там.