Ninject 如何在 ASP.NET MVC 中创建控制器?

发布于 2024-10-18 00:29:02 字数 176 浏览 4 评论 0原文

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

This may be stupid question, but I am looking at Ninject sources and don't see NInject registering its own controller factory. I also don't see any IControllerFactory class in Ninject.Web.Mvc assembly. Am I missing something? How does Ninject create controller and inject parameters into constructor?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

奶气 2024-10-25 00:29:03

由于控制器是具体类型,Ninject 将进行自绑定。以下是来自 ninject.complex.com 的片段

请记住,只有具体类型可以进行自绑定;抽象的
类型和接口将不起作用。另外,如果您请求一个实例
可以自绑定的类型,并且没有为该类型定义任何绑定
type,Ninject 会自动创建一个隐式的自绑定。它是
由您决定是否要显式定义绑定,或者让
Ninject 弄清楚了。

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

Since controllers are concrete types, Ninject will do self bind. Below is a snippet from ninject.complex.com

Bear in mind that only concrete types can be self-bound; abstract
types and interfaces won't work. Also, if you request an instance of a
type that can be self-bound, and there are no bindings defined for the
type, Ninject will automatically create an implicit self-binding. It's
up to you whether you want to define your bindings explicitly, or let
Ninject figure it out.

If you do need to inject parameters into the constructor. You can create a class inherits from INinjectModule and do the binding there.

小草泠泠 2024-10-25 00:29:02
  1. 假设我们正在寻找“/Task/Index”。
  2. Ninject MVC 应用程序现在使用 DefaultControllerFactory,与非 Ninject 应用程序相同。
  3. DefaultControllerFactory 查找控制器 (TaskController) 的类型。
  4. DefaultControllerFactory 有一个名为 DefaultControllerActivator 的内部类。 DefaultControllerActivator 有一个名为 Create 的方法,它返回控制器实例。 DefaultControllerFactoryDefaultControllerActivator 请求 TaskController 类型实例。
  5. DefaultControllerActivator.Create 使用IDependencyResolver。这就是 Ninject 发挥作用的地方。由于 Ninject 实现了自己的解析器并在应用程序启动时设置它,因此他收到对 TaskController 实例的请求。
  6. 剩下的就很容易了。 Ninject 找到该类型的构造函数,注入参数,返回控制器实例。
  1. Lets say we are looking for "/Task/Index".
  2. Ninject MVC applications use now DefaultControllerFactory, the same as non-Ninject applications.
  3. DefaultControllerFactory finds type for controller (TaskController).
  4. DefaultControllerFactory has internal class called DefaultControllerActivator. DefaultControllerActivator has method called Create, which returns controller instance. DefaultControllerFactory asks DefaultControllerActivator for TaskController type instance.
  5. DefaultControllerActivator.Create uses IDependencyResolver. This is where Ninject comes in. Since Ninject implements its own resolver and sets it at the start of application, he gets request for TaskController instance.
  6. The rest is easy. Ninject finds constructor for this type, injects parameters, returns controller instance.
忆悲凉 2024-10-25 00:29:02

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

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

MVC3 now recommends the usage of the IDependencyResolver interface instead of the good old IControllerFactory when dealing with DI. You can look at more details of this interface here.

This is the new Ninject class responsible for injecting the dependencies.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文