Linq:限定范围的数据上下文、工作单元、存储库
本文关键字:工作 单元 存储 上下文 数据 范围 Linq | 更新日期: 2023-09-27 18:15:05
我一直在研究c#中的工作单元和存储库模式。DataContext实现了工作单元模式,并可用于实现存储库接口。DataContext中缺少的最后一点是在预定义的范围内全局共享此资源的方法。
我简单地看了看NCommon作为这个缺失部分的解决方案。你会分享你在NCommon的经验,或者推荐其他的解决方案吗?如果我有误解,也请纠正我。谢谢。
我总是以与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的构造函数中配置"当前提供商"
希望能有所帮助。