我在互联网上找到了一篇介绍如何实现存储库模式的文章。实现看起来像这样:
class ProductRepository : IProductRepository
{
var context;
public ProductRepository() {
this.context = new MyDataBaseDataContext();
}
// the rest of methods
}
但我不太确定这是对的,上下文发生了什么?垃圾收集器是否处置此对象?或者我应该使用使用(...){} 语句创建上下文?
答案 0 :(得分:2)
Repository
不应该打开数据上下文,DataContext
必须传递给它 - 因为它不能拥有它。 假设您的操作需要在交易中并涉及多个存储库,您会做什么?
您需要使用UnitOfWork
pattern。
在此模式中,UoW
(包装DataContext
)将传递到存储库。
实际,业务层中的ProductManager
会创建Unit Of Work
。
答案 1 :(得分:1)
这个问题的简单答案是存储库应该确保自己处理数据上下文,而不是让.NET运行时最终确定它。这可以通过遵循标准的.NET dispose模式来实现......
class ProductRepository : IProductRepository, IDisposable
{
var context;
public ProductRepository() {
this.context = new MyDataBaseDataContext();
}
// the rest of methods
public void Dispose()
{
if (context != null)
{
context.Dispose();
context = null;
}
}
}
答案 2 :(得分:0)
我想这取决于您是否需要跨存储库操作的事务以及跟踪更改的需求。数据datacontext非常有用,因为它可以让你检索一堆对象,在应用程序中修改它们,然后在你认为合适的任何时候调用SubmitChanges / RollbackChanges。但是如果你没有在你的存储库中公开这个功能,你可能最好只在每个存储库方法中“使用”一个实例,因为这将保留内存使用和资源以跟踪更改。