[英]DI with disposable objects
假设我的存储库类如下所示:
class myRepository : IDisposable{
private DataContext _context;
public myRepository(DataContext context){
_context = context;
}
public void Dispose(){
// to do: implement dispose of DataContext
}
}
现在,我正在使用Unity来控制存储库和数据上下文的生存期,并将生存期配置为:
DataContext
单例
myRepository
每次创建一个新实例
这是否意味着我不应该在存储库上实现IDisposable来清理DataContext?
有关这些项目的任何指导?
编辑: DataContext
单例-将其作为每个Web请求的单例读取
通常, 抽象依赖项不应从IDisposable派生 ,因为它将是Leaky Abstraction 。 依赖项可能取决于也可能不持有非托管资源, 具体取决于具体实现。 在任何情况下, 容器都应该管理生存期 ,因此,它不是由使用者来决定的-它不了解依赖项的生命期:它可以与其他使用者共享,在这种情况下,过早处置将具有破坏性它的。
就是说,(LINQ to SQL?)DataContext代表了一个不同的问题,因为它已经实现了IDisposable,并且由于它是在BCL中定义的,因此您不能很好地更改它。
您可以为存储库正确实现IDisposable,但这意味着您必须匹配所有存储库和数据上下文的生存期 。
另一种选择是简单地忽略您持有的是一次性资源,但是如果这样做,则必须绝对确保 Unity在适当的时候正确处置了DataContext-但由于您计划使用Singleton一生,这应该不是问题。
如果您是我,那么我将改为执行UnitOfWork模式实现,或者让IOC容器管理DataContext的生存期。
例如,Structuremap具有HttpContextScoped选项,因此您可以像这样注册DataContext:
For<DataContext>().HttpContextScoped().Use<MyDataContext>();
这是否意味着我不应该在存储库上实现IDisposable来清理DataContext?
听起来很像-按照您的意思,所有存储库将共享相同的DataContext
,但是您创建的第一个存储库将对其进行处理。
是什么创建DataContext
? 不管是什么,它都应该处理掉。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.