我在一个新的 Web 应用程序上使用 NInject,有两件事我不清楚:
我不需要保留对内核的引用(会话/应用变量)以确保 GC 不会收集我的所有实例吗?例如,如果我指定 .Using() 然后收集 Kernel 对象,我的所有“单例”不也被收集了吗?
如果我确实需要保留对 Kernel 对象的引用,我如何允许传递给 WithArguments() 的参数发生变化,或者这是不可能的。
我在一个新的 Web 应用程序上使用 NInject,有两件事我不清楚:
我不需要保留对内核的引用(会话/应用变量)以确保 GC 不会收集我的所有实例吗?例如,如果我指定 .Using() 然后收集 Kernel 对象,我的所有“单例”不也被收集了吗?
如果我确实需要保留对 Kernel 对象的引用,我如何允许传递给 WithArguments() 的参数发生变化,或者这是不可能的。
确实,您不想绕过内核。通常,在 Web 应用程序中,我将内核存储在 HttpApplication 的静态属性中。如果您需要对内核的引用,您可以只公开一个类型为 IKernel 的依赖项(通过构造函数参数或属性),然后 Ninject 将为您提供对激活该类型的内核的引用。
如果在绑定上使用 WithArguments(),它们将用于所有激活。如果您使用 IParameters,它们将仅用于该激活。(但是,如果您正在激活的服务具有像 Singleton 这样的可重用行为,即使您传递不同的 IParameters,它也不会被重新激活。)
这是开始使用 IoC 容器时的常见陷阱。请参阅此相关问题。
简而言之:
Mark Seeman -- Manning Dependency Injection的作者建议使用好莱坞原则不要打电话给我们(IOC 框架),我们会打电话给你...... IOC 容器应该放在 Application 的 Composition root.. 它需要按要求实例化.. 就像提到的 wat nate
.. 对于 Web 应用程序,组合根是 Global.asax 文件,您可以在其中使用覆盖启动事件,并且您可以绑定您的 Ninject 来解析组件