DataContext的生命周期,LinqToSql

时间:2011-05-03 13:46:39

标签: c# linq-to-sql repository-pattern datacontext

我在互联网上找到了一篇介绍如何实现存储库模式的文章。实现看起来像这样:

class ProductRepository : IProductRepository
{

    var context;
    public ProductRepository() {
        this.context = new MyDataBaseDataContext(); 
    }
    // the rest of methods
}

但我不太确定这是对的,上下文发生了什么?垃圾收集器是否处置此对象?或者我应该使用使用(...){} 语句创建上下文?

3 个答案:

答案 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。但是如果你没有在你的存储库中公开这个功能,你可能最好只在每个存储库方法中“使用”一个实例,因为这将保留内存使用和资源以跟踪更改。