我一直在研究C#中的工作单元和存储库模式。DataContext实现了工作单元模式,并可用于实现存储库接口。DataContext缺少的最后一部分是在预定义的范围内全局共享此资源的方法。
我简单介绍了一下NCommon,将其作为这个缺失部分的解决方案。您会分享您在NCommon中的经验,或推荐其他解决方案吗?如果我误解了,也请纠正我。谢谢。
发布于 2011-12-14 14:32:36
我一直以和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(); } }对于web:
在你的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;在您的请求Begin事件中,您放置了:
dataContextProvider.OpenNew();在你的请求结束事件中,你放了:
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方法中打开和关闭数据上下文,并在测试或TestFixtureSetUp的构造函数中配置“当前提供程序”
希望能有所帮助。
https://stackoverflow.com/questions/8169615
复制相似问题