当使用语句时,使用ninject处理EF DbContext

时间:2014-12-12 07:34:50

标签: c# asp.net-mvc-4 dependency-injection ninject idisposable

我正在使用SQL server 2008.NET4.5MVC4EF6Ninject3.2

我有需要迁移的应用程序才能在Ninject中使用DI。必须注入控制器的DbContextOnlineLegal 目前,它在每个操作中都使用了以下内容。

 using (var db = new OnlineLegal())
            {
    ...
            }

这使得OnlineLegal被使用和处置的地方清晰可见。

如果我要设置ninject kernel.Bind<OnlineLegal>().ToSelf().InRequestScope(); 这是否足以确保它在MVC4中为disposed properly on each request?如果不是,我应该manually register OnePerRequestModule?或者用其他方式做到这一点?

1 个答案:

答案 0 :(得分:2)

这就足够了。如果您已安装Ninject.MVC4包; - )。

但是,最近有一些关于InRequestScope无效的问题。我认为目前ninject设置有点容易出错和/或包安装/升级程序问题。

因此我建议使用.InRequestScope(),但也要添加一个(示例和自动化)集成测试,以验证.InRequestScope()是否实际正确执行了处理。 这将向您显示您已正确集成它,如果将来应该遇到包升级程序的问题,您可以立即找到并修复它,而不是在生产中或通过一些模糊的效果查找。

文档链接:https://github.com/ninject/Ninject.Web.Common/wiki/InRequestScope

Ninject.MVC4依赖于Ninject.Web.Common.Webhost。 Ninject.Web.Common.WebHost将NinjectWebCommon.cs代码添加到应用程序的app_start文件夹中。 NinjectWebCommon.cs加载OnerPerRequestModule。但是,如果删除该文件,则会中断.InRequestScope()。关于这一点的坏处是,它无一例外地失败。你仍然可以绑定.InRequestScope(),但它只是没有任何效果。