Как Ninject создает контроллер в ASP.NET MVC? - PullRequest
11 голосов
/ 16 февраля 2011

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

Ответы [ 3 ]

13 голосов
/ 19 февраля 2011
  1. Допустим, мы ищем "/ Task / Index".
  2. В приложениях Ninject MVC теперь используется DefaultControllerFactory, так же, как в приложениях, отличных от Ninject.
  3. DefaultControllerFactory находит тип для контроллера (TaskController).
  4. DefaultControllerFactory имеет внутренний класс с именем DefaultControllerActivator.DefaultControllerActivator имеет метод с именем Create, который возвращает экземпляр контроллера.DefaultControllerFactory запрашивает DefaultControllerActivator для экземпляра типа TaskController.
  5. DefaultControllerActivator.Create использует IDependencyResolver.Вот тут и приходит Ninject. Так как Ninject реализует свой собственный распознаватель и устанавливает его в начале приложения, он получает запрос на TaskController экземпляр.
  6. Остальное легко.Ninject находит конструктор для этого типа, вставляет параметры, возвращает экземпляр контроллера.
4 голосов
/ 16 февраля 2011

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

Это новый класс Ninject , отвечающий за внедрение зависимостей.

0 голосов
/ 19 октября 2011

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

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

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

...