我一直在研究C#中的工作单元和存储库模式。 AFAIK,DataContext实现工作单元模式,可用于实现存储库接口。 DataContext中缺少的最后一个部分是在预定义范围内全局共享此资源的方法。
我简要地看了NCommon作为这个缺失部分的解决方案。您会分享您在NCommon的经验,还是推荐其他解决方案?如果我误解了,请纠正我。感谢。
答案 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的构造函数中配置“当前提供者”
希望它有所帮助。