Это может быть глупый вопрос, но я смотрю на источники Ninject и не вижу, чтобы NInject регистрировал свой собственный контроллер factory. Я также не вижу класса IControllerFactory
в сборке Ninject.Web.Mvc
. Я что-то упускаю? Как Ninject создает контроллер и вводит параметры в конструктор?
Как Ninject создает контроллер в ASP.NET MVC?
Ответ 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
, и выполнить привязку там.