Ninject.MVC3 Bootstrapper的内核属性标记为已过时。我怎样才能访问内核?

时间:2011-05-18 15:59:41

标签: asp.net-mvc-3 ninject bootstrapper

我将Ninject.MVC3软件包从2.2.1.0更新到2.2.2.0。在我通过BootStrapper.Kernel属性访问Kernel对象之前,但在新版本中,Kernel属性被标记为已过时。我收到警告说

'Public ReadOnly属性内核为Ninject.IKernel'已过时:'不要将Ninject用作服务定位器'。

在新版本中是否有不同的方式来访问内核?

4 个答案:

答案 0 :(得分:6)

如果你有一个类(由于某种原因)需要从Ninject内核中检索对象,你可以将内核作为类中注入的属性/构造函数参数之一。这种模式在你明确声明某个特定类正在使用内核的意义上更好,而不是像服务定位器模式那样始终可用。

这假设Ninject会自动将内核的实例绑定添加到自身。我知道它曾经这样做,但如果没有,你可以手动添加绑定。

答案 1 :(得分:5)

之所以将其标记为已过时并将在未来更改为内部的原因是人们倾向于使用Ninject作为服务定位器(如果可以的话)。但Service Locator is an antipattern不应该使用。由于我们不想提供有助于构建设计糟糕的软件的功能,因此将来会将其删除。

如果这需要对代码进行大量更改,这表明您的代码正在遭受这种不适依赖注入,并且您真的应该将其更改为更好的设计。

  1. 将对内核的访问权限限制为最小值。在MVC中几乎没有任何情况你需要除了普通构造函数注入之外的东西。因此,我的第一个建议是尽可能重构构造函数注入。
  2. 对于极少数需要访问内核以创建其他对象的情况,您应该将工厂注入需要新实例的类并将内核注入此工厂(如果构造函数具有Kernel参数,它将接收执行注入的实例。
  3. 如果你真的想留在服务定位器中,即使几乎每个人都告诉你不要,你也必须自己保留静态参考。

答案 2 :(得分:2)

在ASP.NET MVC 3中,我认为DepedencyResolver是一种获取服务定位器的简洁方法。

答案 3 :(得分:0)

您可以将Common Service Locator用作Ninject的服务位置挂钩。公共服务定位器仅允许您检索对象,而不是注入您已有的对象。当然你可以解决这个限制,但你可以很容易地创建一个暴露Ninject内核并引用而不是BootStrapper的静态类。