NInject:你在哪里保留对内核的引用?

时间:2009-02-26 15:03:25

标签: c# dependency-injection inversion-of-control ioc-container ninject

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

  1. 我是否需要保持对内核(Session / App变量)的引用以确保GC不收集我的所有实例?例如,如果我指定.Using()然后收集Kernel对象,那么我的所有“单身人士”也不是都收集了吗?

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

3 个答案:

答案 0 :(得分:29)

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

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

答案 1 :(得分:16)

这是开始使用IoC容器时常见的陷阱。请参阅this related question

简而言之:

  • 通过你的容器是不好的做法(去过那里,做到了,真的很疼)
  • 如果你真的需要直接调用容器,首先考虑抽象到一个注入的工厂,然后作为最后一个资源考虑使用一个静态网关到容器

答案 2 :(得分:-4)

Mark Seeman - Manning Dependency Injection Suggust to Use 好莱坞原则的作者不要打电话给我们(IOC框架)我们会打电话给你...... .. IOC容器应该是放置在应用程序的组合根...中,它需要按照请求进行实例化..就像上面提到的那样

..对于Web应用程序,Composition根是Global.asax文件,你可以使用覆盖启动事件,你可以绑定你的Ninject来解析组件