假设我的存储库类看起来像这样:
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
- 单例 - 将其读作单个每网络请求
答案 0 :(得分:4)
作为一般规则,抽象依赖关系不应来自IDisposable ,因为它将是 Leaky Abstraction 。依赖关系可能会或可能不会保留依赖于具体实现的非托管资源。在任何情况下,容器都应该管理生命周期,因此消费者无法做到这一点 - 它不了解依赖关系的生命周期:它可以与其他消费者共享,在这种情况下破坏性地过早处置它
。那就说一个(LINQ to SQL?)DataContext代表了一个不同的问题,因为它已经实现了IDisposable,你不能很好地改变它,因为它是在BCL中定义的。
您可以为您的存储库正确实现IDisposable,但这意味着您必须为所有存储库和datacontext 匹配生存期。
另一种选择是简单地忽略您持有的可支配资源,但如果您这样做,则必须使完全确定 Unity正确处理DataContext时间 - 但由于你计划使用Singleton生命周期,这应该不是问题。
答案 1 :(得分:3)
如果我是你,我会改为执行UnitOfWork模式,或让IOC容器管理DataContext的生命周期。
例如,Structuremap有一个HttpContextScoped选项,所以你可以这样注册你的DataContext:
For<DataContext>().HttpContextScoped().Use<MyDataContext>();
答案 2 :(得分:0)
这是否意味着我不应该在存储库上实现IDisposable来清理DataContext?
听起来像是 - 从你所说的,所有存储库将共享相同的DataContext
,但你创建的第一个存储库将处置它。
是什么造成了DataContext
?不管是什么,都应该处理它。