我在一个新的Web应用程序上使用NInject,有两件事我不清楚:
我是否需要保持对内核(Session / App变量)的引用以确保GC不收集我的所有实例?例如,如果我指定.Using()然后收集Kernel对象,那么我的所有“单身人士”也不是都收集了吗?
如果我确实需要保持对内核对象的引用,如何允许传入WithArguments()的参数发生变化,或者这是不可能的。
答案 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来解析组件