Linq:限定范围的数据上下文、工作单元、存储库

本文关键字:工作 单元 存储 上下文 数据 范围 Linq | 更新日期: 2023-09-27 18:15:05

我一直在研究c#中的工作单元和存储库模式。DataContext实现了工作单元模式,并可用于实现存储库接口。DataContext中缺少的最后一点是在预定义的范围内全局共享此资源的方法。

我简单地看了看NCommon作为这个缺失部分的解决方案。你会分享你在NCommon的经验,或者推荐其他的解决方案吗?如果我有误解,也请纠正我。谢谢。

Linq:限定范围的数据上下文、工作单元、存储库

我总是以与NHibernate相同的方式使用DataContext:使用静态方式获取它,并使用不同的存储方式存储它。例如,它可以存储在基于web的应用程序的HttpContext.Current.Items集合中,或者在Call中。单元测试的上下文。何时创建实例以及何时关闭实例将取决于场景。同样,对于web来说,在应用程序的Request_begin和Request_end事件上这样做是有意义的。对于单元测试,可能是在安装和拆卸时。

希望有帮助。

编辑:这里是一些实现

public abstract class DataContextProvider
{
    public abstract DataContext GetCurrent();
    public abstract void OpenNew();
    public void CloseCurrent()
    {
        var current = GetCurrent();
        current.Dispose();
    }
}

在你的数据上下文中添加:

public static DataContextProvider Provider { private get; set; }
public static DataContext Current { get { return Provider.GetCurrent(); } }
网络:

在你的web项目中,你把这个类:

public class WebDataContextProvider : DataContextProvider 
{
    private const string Key = "WebDataContextProvider.DataContext";
    public override DataContext GetCurrent()
    {
        return (DataContext)HttpContext.Current.Items[Key];
    }
    public override void OpenNew()
    {
        HttpContext.Current.Items[Key] = new DataContext();
    }
}

在你的global.asax:

添加WebDataContextProvider类型的字段:

WebDataContextProvider dataContextProvider = new WebDataContextProvider();

你重写了应用程序的启动事件:

DataContext.Provider = dataContextProvider;

在Request Begin事件中输入:

dataContextProvider.OpenNew();

在请求结束事件中输入:

dataContextProvider.CloseCurrent();
为测试<<p> /em> 对于您的测试项目,您可以遵循相同的逻辑,但是创建一个TestDataContextProvider,如:
public class WebDataContextProvider : DataContextProvider 
{
    [ThreadStatic]
    private static DataContext Current;
    public override DataContext GetCurrent()
    {
        return Current;
    }
    public override void OpenNew()
    {
        Current = new DataContext();
    }
}

在你的SetUp和TearDown方法中打开和关闭数据上下文,并在Test或TestFixtureSetUp的构造函数中配置"当前提供商"

希望能有所帮助。