当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()方法实际上没有任何事情可做。