首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linq:作用域DataContext、工作单元、存储库

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

Stack Overflow用户
提问于 2011-11-17 23:20:54
回答 1查看 500关注 0票数 0

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

我简单介绍了一下NCommon,将其作为这个缺失部分的解决方案。您会分享您在NCommon中的经验,或推荐其他解决方案吗?如果我误解了,也请纠正我。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2011-12-14 14:32:36

我一直以和NHibernate一样的方式使用DataContext :使用静态的方式获取数据,使用不同的存储空间存储数据。例如,对于基于web的应用程序,它可以存储在HttpContext.Current.Items集合中,或者对于单元测试,它可以存储在Call.Context中。您何时创建实例以及何时关闭实例将取决于场景。同样,对于web来说,在应用程序的Request_begin和Request_end事件上执行此操作是有意义的。对于单元测试,可能需要进行设置和拆卸。

希望能有所帮助。

编辑:下面是一些实现

代码语言:javascript
复制
public abstract class DataContextProvider
{
    public abstract DataContext GetCurrent();
    public abstract void OpenNew();

    public void CloseCurrent()
    {
        var current = GetCurrent();
        current.Dispose();
    }
}

在您的数据上下文中添加以下内容:

代码语言:javascript
复制
public static DataContextProvider Provider { private get; set; }

public static DataContext Current { get { return Provider.GetCurrent(); } }

对于web:

在你的web项目中,你放置了这个类:

代码语言:javascript
复制
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类型的字段:

代码语言:javascript
复制
WebDataContextProvider dataContextProvider = new WebDataContextProvider();

您可以重写应用程序启动事件以执行以下操作:

代码语言:javascript
复制
DataContext.Provider = dataContextProvider;

在您的请求Begin事件中,您放置了:

代码语言:javascript
复制
dataContextProvider.OpenNew();

在你的请求结束事件中,你放了:

代码语言:javascript
复制
dataContextProvider.CloseCurrent();

用于测试

对于您的测试项目,您可以遵循相同的逻辑,但要创建一个TestDataContextProvider,如:

代码语言:javascript
复制
public class WebDataContextProvider : DataContextProvider 
{
    [ThreadStatic]
    private static DataContext Current;

    public override DataContext GetCurrent()
    {
        return Current;
    }

    public override void OpenNew()
    {
        Current = new DataContext();
    }
}

在SetUp和TearDown方法中打开和关闭数据上下文,并在测试或TestFixtureSetUp的构造函数中配置“当前提供程序”

希望能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8169615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档