48

我在一个新的 Web 应用程序上使用 NInject,有两件事我不清楚:

  1. 我不需要保留对内核的引用(会话/应用变量)以确保 GC 不会收集我的所有实例吗?例如,如果我指定 .Using() 然后收集 Kernel 对象,我的所有“单例”不也被收集了吗?

  2. 如果我确实需要保留对 Kernel 对象的引用,我如何允许传递给 WithArguments() 的参数发生变化,或者这是不可能的。

4

3 回答 3

29

确实,您不想绕过内核。通常,在 Web 应用程序中,我将内核存储在 HttpApplication 的静态属性中。如果您需要对内核的引用,您可以只公开一个类型为 IKernel 的依赖项(通过构造函数参数或属性),然后 Ninject 将为您提供对激活该类型的内核的引用。

如果在绑定上使用 WithArguments(),它们将用于所有激活。如果您使用 IParameters,它们将仅用于该激活。(但是,如果您正在激活的服务具有像 Singleton 这样的可重用行为,即使您传递不同的 IParameters,它也不会被重新激活。)

于 2009-02-26T16:39:08.747 回答
16

这是开始使用 IoC 容器时的常见陷阱。请参阅此相关问题

简而言之:

  • 传递你的容器是不好的做法(去过那里,做过,真的很痛)
  • 如果你真的需要直接调用容器,首先考虑抽象为注入工厂,然后作为最后一个资源考虑使用容器的静态网关
于 2009-02-26T15:20:49.840 回答
-4

Mark Seeman -- Manning Dependency Injection的作者建议使用好莱坞原则不要打电话给我们(IOC 框架),我们会打电话给你...... IOC 容器应该放在 Application 的 Composition root.. 它需要按要求实例化.. 就像提到的 wat nate

.. 对于 Web 应用程序,组合根是 Global.asax 文件,您可以在其中使用覆盖启动事件,并且您可以绑定您的 Ninject 来解析组件

于 2011-03-22T04:21:23.993 回答