这是一个普遍的问题,虽然我确实有一个我正在看的特定实例,所以我试图尽可能保持标题和标签的通用性.
我正在和IOC一起做MVC项目.我的具体存储库实现IDisposable
了处理Ef Context.
显然,MVC处理被调用的Controller对象的处理.但是,我需要Dispose()
在控制器中覆盖吗?这是我现在的代码:
private IUserRepository repository; public UserController(IUserRepository repository) { this.repository = repository; } protected override void Dispose(bool disposing) { if (repository is IDisposable && repository != null) { (repository as IDisposable).Dispose(); repository = null; } base.Dispose(disposing); }
我检查以确保它IDisposable
从我的单元测试中实现为模拟我不认为实现它.
现在,我的问题是超越Dispose()
冗余?当Controller(或任何其他对象)被释放时,垃圾收集器是否会查找实现的任何属性IDisposable
,或者我是否正确执行此操作?
处置对象不会自动处理其所有属性IDisposables
.它所做的只是执行Dispose
方法,然后对象所做的就是开发人员.
当处理类的对象时,它应该处置实现该接口的所有拥有的资源IDisposable
.在您的情况下,您处置一个很可能仍在使用的对象.
我认为Stephen Cleary关于IDisposable的文章:你的母亲从未告诉过你关于资源释放的内容解释了处理对象以及在某些情况下可能出现的困难和问题.