我在ASP MVC项目中使用Ninject进行数据库绑定。在“私有静态IKernel CreateKernel()”中,我将绑定数据库对象,如下所示:
kernel.Bind<IDbSession>().ToProvider<IDbSession>(new NhDbSessionProvider()).InRequestScope();
这几乎可以按预期工作,但是站点上的某些页面使用AJAX调用控制器上的方法,并且似乎这些调用中的每一个都会打开一个SQL连接,并且在控制器返回时不会对其进行处理。最终,这将导致SQL数据库上的NumberOfConnections超过最大值,并且该站点引发错误,提示连接不可用。
我对Ninject很陌生,他接管了一个现有项目,试图在不做重大更改的情况下完成这项工作。有什么想法可以处理这些对象吗?看来他们应该已经从我正在阅读的内容中自动进行了此操作,但也许我只是不理解。
如果我需要共享更多代码,请告诉我。
答案 0 :(得分:1)
根据documentation,一次性实例在请求处理结束时处置。
但是,InRequestScope的文档在Ensuring Deterministic Dispose calls in a Request Processing cycle中有一节。
特别是:
使用Ninject.Web.Common包
在web.config中手动注册OnePerRequestModule(例如,如果您 不使用Ninject.Web.MVC * NuGet包)
可能是您的实例正在/将要被处置的情况,但并非在您期望实例被执行的时候。
答案 1 :(得分:0)
似乎有人出于某种原因(不是我)注释了此行。重新添加即可解决该问题。
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));