当Ninject用作依赖项解析器时,如何在asp.net mvc3 App中处理DbContext(或对象)
对于这个Demo,我创建了一个虚假的Database +存储库,如下所示
假Db +存储库
public interface IDemoRepository { string[] GetUsers(); } public class DemoRepository : IDemoRepository, IDisposable { public string[] GetUsers() { string[] Users = { "Robert","Linda","Jack"}; return Users; } public void Dispose() { //do nothing throw new Exception("Disposed is called"); } }
我的控制器看起来如此
public class TestController:Controller { protected IDemoRepository _repository; public BaseController(IDemoRepository repository) { _repository = repository; } public ActionResult() { var users = _repository.GetUsers(); Return View(users); } }
Ninject Part
我从NUGet安装了ninject并在下面添加了用于解析存储库的代码
kernel.Bind().To()
Ninject没有调用DemoRepository.Dispose
,我添加了一个断点,即使我当前的代码抛出错误但是Ninject没有调用DemoRepository.Dispose
。
任何人都能建议我如何处置这个物体。
如果要处置,请确保您的存储库绑定到Ninject中的请求范围:
kernel.Bind().To().InRequestScope();
您不需要Dispose()
DbContext
,因为它已经正确管理所有连接。 这是ASP.NET MVC提示#34 – 处理您的DataContext(或不要)的引用:
调用DataContext.Dispose()方法的最重要结果是与DataContext关联的任何打开的连接都将关闭。 这似乎非常重要,但事实并非如此。 它不重要的原因是DataContext类已经管理了它的连接。 默认情况下,DataContext类会自动打开和关闭连接。
…
通常,当您在DataContext对象上调用Dispose()方法时,与DataContext对象关联的任何数据库连接都已关闭。 DataContext对象在执行数据库查询后立即关闭了数据库连接。 因此,Dispose()方法实际上没有任何事情可做。