Linq to SQL仓储应该实现IDisposable吗?

3
我最近在搜索使用Linq的仓储模式方面的大量信息。虽然有很多信息,但常常相互矛盾,我仍在寻找权威的来源。
有一件事我仍不确定,那就是仓储是否应该实例化自己的DataContext并具有SubmitChanges方法,还是将DataContext注入并由外部处理提交。我见过这两种设计,但没有真正的解释。
无论如何,以下模式非常常见。
class Repository<T>
{
    DataContext db = new LinqDataContext();

    public IEnumerable<T> GetAll() { ... }
    public T GetById() { ... }

    ... etc

   public void SubmitChanges() { ... }
}

我的主要问题是,使用以上实现方式,为什么存储库不需要实现IDisposable?我已经看到了几百个类似的例子,但似乎没有人费心去处理DataContext的释放。这不会造成内存泄漏吗?


这是一个网站还是一个“胖”客户端? - Rob Fonseca-Ensor
2个回答

3

释放DataContext会关闭底层连接,如果您的自动关闭设置为false。如果您不调用dispose,则必须等待GC为您调用dispose。您应该实现IDisposable并处理您的存储库,这些存储库应依次处理他们的DataContext。

另一种解决方案是为存储库中的每个方法创建一个新的数据上下文,如果您的方法在单个事务中无法共同使用。然后,您可以通过using()指令尽快处理它们使用过的上下文。


如果您关闭了DataContext,那么就无法提交对返回对象所做的任何更改。这是正确的吗?或者一个新的context仍然可以找出哪些项目是脏的吗? - fearofawhackplanet
每个实例都有自己的状态。当您处理 DataContext 时,它会释放用于跟踪更改的对象缓存。 - BC.
MSDN指出:通常情况下,DataContext实例被设计为持续一个“工作单元”,不过这个“工作单元”的定义取决于你的应用程序。DataContext轻量级且创建成本不高。典型的LINQ to SQL应用程序会在方法范围内或作为代表相关数据库操作逻辑集合的短暂类的成员中创建DataContext实例。 - BC.

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接