11

这可能是个愚蠢的问题,但我正在查看 Ninject 来源,并没有看到 NInject 注册了自己的控制器工厂。我也没有在汇编中看到任何IControllerFactory课程。Ninject.Web.Mvc我错过了什么吗?Ninject 如何创建控制器并将参数注入构造函数?

4

3 回答 3

13
  1. 假设我们正在寻找“/Task/Index”。
  2. 现在使用 Ninject MVC 应用程序DefaultControllerFactory,与非 Ninject 应用程序相同。
  3. DefaultControllerFactory查找控制器 ( TaskController) 的类型。
  4. DefaultControllerFactory有内部类称为DefaultControllerActivator. DefaultControllerActivator有方法调用Create,它返回控制器实例。DefaultControllerFactory要求类型实例DefaultControllerActivatorTaskController
  5. DefaultControllerActivator.Create使用IDependencyResolver. 这就是Ninject进来的地方。由于Ninject实现了自己的解析器并在应用程序开始时设置它,因此他得到了请求TaskController
  6. 其余的很容易。Ninject找到这种类型的构造函数,注入参数,返回控制器实例。
于 2011-02-19T05:40:04.040 回答
4

MVC3 现在建议在处理 DI 时使用IDependencyResolver接口而不是旧的接口。IControllerFactory您可以在此处查看此界面的更多详细信息。

这是负责注入依赖项的新 Ninject 类。

于 2011-02-16T16:18:57.537 回答
0

由于控制器是具体类型,Ninject 会进行自绑定。以下是摘录自ninject.complex.com

请记住,只有具体类型可以自绑定;抽象类型和接口将不起作用。此外,如果您请求可以自绑定的类型的实例,并且没有为该类型定义绑定,Ninject 将自动创建隐式自绑定。是否要显式定义绑定,或者让 Ninject 解决,这取决于您。

如果您确实需要将参数注入构造函数。您可以创建一个类继承INinjectModule并在那里进行绑定。

于 2011-10-19T19:26:27.920 回答