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

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

  1. 我不需要保持对内核的引用(Session / Appvariables),以确保GC不会收集所有的实例吗? 例如,如果我指定。使用()然后收集内核对象,并不是我所有的“单身”收集?

  2. 如果我确实需要保持对内核对象的引用,那么如何让传递给WithArguments()的参数改变或者是不可能的。

确实,你不想传递内核。 通常,在Web应用程序中,我将内核存储在HttpApplication中的一个静态属性中。 如果你需要对内核的引用,你可以公开一个types为IKernel的依赖(通过构造函数参数或者属性),Ninject会给你一个引用内核的引用。

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

在开始使用IoC容器时,这是一个常见的错误。 看到这个相关的问题 。

简而言之:

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

Mark Seeman – Manningdependency injection的作者Suggust使用好莱坞原则不要打电话给我们(IOC框架)而是我们会打电话给你…… IOC容器应该被放置在应用程序的Composition根目录下,它需要作为请求被实例化

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