Linq:作用域DataContext,工作单元,存储库

时间:2011-11-17 15:20:54

标签: c# linq datacontext

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

我简要地看了NCommon作为这个缺失部分的解决方案。您会分享您在NCommon的经验,还是推荐其他解决方案?如果我误解了,请纠正我。感谢。

1 个答案:

答案 0 :(得分:0)

我总是以与NHibernate相同的方式使用DataContext:有一个静态的方法来获取它和不同的存储来存储它。例如,它可以存储在基于Web的应用程序的HttpContext.Current.Items集合中,或者存储在单元测试的Call.Context中。何时创建实例以及何时关闭它将取决于方案。同样,对于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(); } }

对于网络:

在您的网络项目中,您可以使用此课程:

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;

在您的请求开始事件中,您输入:

dataContextProvider.OpenNew();

在你的Request End事件中你输入了:

dataContextProvider.CloseCurrent();

进行测试

对于测试项目,您可以遵循相同的逻辑,但创建一个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的构造函数中配置“当前提供者”

希望它有所帮助。