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

mah*_*chR 9 ninject bootstrapper asp.net-mvc-3

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

'Public ReadOnly Property Kernel As Ninject.IKernel'已过时:'不要将Ninject用作服务定位器'.

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

Joh*_*soe 6

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

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


Rem*_*oor 5

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

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

  1. 将您对内核的访问限制为最小值.在MVC中几乎没有任何情况你需要除了普通构造函数注入之外的东西.因此,我的第一个建议是尽可能重构构造函数注入.
  2. 对于需要访问内核以创建其他对象的极少数情况,您应该将工厂注入需要新实例的类并将内核注入此工厂(如果构造函数有Kernel参数,它将接收实例做注射).

如果你真的想留在服务定位器,即使几乎每个人都告诉你不要,你必须自己保留静态参考.

  • 所有我的MVC相关代码,例如控制器都有构造函数注入,所以没有问题.但在某种情况下,我必须实现一个自定义成员资格提供程序,我想将IRepository传递给ctor.我能找到的解决方案是http://stackoverflow.com/questions/5596441/inject-repository-to-custom-membership-provider-with-ninject.这就是我需要访问内核的原因.你知道更好的方法吗? (3认同)