Linq to sql 林克';数据上下文和;“工作单位”;图案我的方法行吗?
按照许多文章的指导,我决定在我的Linq to sql 林克';数据上下文和;“工作单位”;图案我的方法行吗?,linq-to-sql,design-patterns,datacontext,webforms,unit-of-work,Linq To Sql,Design Patterns,Datacontext,Webforms,Unit Of Work,按照许多文章的指导,我决定在我的ASP.Net WebForms应用程序中的Linq2SQL DataContexts中实现工作单元模式,但我不确定我的方法是否正确 以下是我到目前为止所取得的成就: 1-在每个请求中,我在Global.asax中捕获应用程序_AcquisiteRequestState事件(可以访问会话数据),并实例化一个新的数据上下文,将其绑定到用户的会话: void Application_AcquireRequestState(object sender, EventArg
ASP.Net WebForms应用程序中的Linq2SQL DataContexts
中实现工作单元
模式,但我不确定我的方法是否正确
以下是我到目前为止所取得的成就:
1-在每个请求
中,我在Global.asax
中捕获应用程序_AcquisiteRequestState
事件(可以访问会话数据),并实例化一个新的数据上下文
,将其绑定到用户的会话
:
void Application_AcquireRequestState(object sender, EventArgs e)
{
// Check if the request is for a Page, Page Method or Handler
if (new Regex(@"\.(aspx|ashx)(/.*)?$").IsMatch(HttpContext.Current.Request.Url.AbsolutePath))
{
MyCompany.MyDatabaseDataContext myDatabaseDataContext = new MyCompany.MyDatabaseDataContext();
HttpContext.Current.Session["myDatabaseDataContext"] = myDatabaseDataContext;
}
}
2-每个数据访问层
对象(DAO)都继承自一个基本DAO
:通用DAO
:
public class GenericDAO
{
private MyDatabaseDataContext _dbMyDatabase;
protected MyDatabaseDataContext dbMyDatabase
{
get
{
if (_dbMyDatabase == null)
_dbMyDatabase = HttpContext.Current.Session["myDatabaseDataContext"] as MyDatabaseDataContext;
return _dbMyDatabase;
}
}
}
3-因此,在每个操作中,DAO
使用其父类中的DataContext
属性:
public class MyTableDAO : GenericDAO
{
public List<MyTable> getAll()
{
return dbMyDatabase.GetTable<MyTable>().ToList();
}
}
通用DAO
public class GenericDAO
{
protected MyDatabaseDataContext dbMyDatabase
{
get
{
return HttpContext.Current.Items["myDatabaseDataContext"] as MyDatabaseDataContext;
}
}
}
就这么简单 您说您正在实现工作单元,但通过将其存储在缓存中,您并没有真正遵守该工作单元
我的建议是为每个请求创建一个新的DataContext,不要缓存它。最好的方法是将它放在HttpContext.Current.Items
,在RequestBegin
上创建DataContext,并在RequestEnd
中处理它。在本文中,有一篇关于更好地管理DataContext的有趣文章,其中建议使用短期DataContext实例
此模式称为视图中的opensession
,是为在web环境中使用NHibernate而创建的。不,正如我所说,以上代码是我迄今为止完成的。请参见我的关注点2和3,它们是我将其作为一个工作单元正确实现的要点。此外,正如现在一样,每个请求都会创建一个新的DTX并将其存储到会话中。以一种不安全的方式,它已经作为一个工作单元工作(异步调用除外,这可能会导致奇怪的结果)。最好的方法是将它放在HttpContext.Current.Items上,在RequestBegin上创建DataContext,并在RequestEnd中处理它。在一篇关于更好地管理DataContext的有趣文章中,建议使用短期DataContext实例。。。嗯@ivowiblo,这似乎是目前为止最好的答案。。。你介意把它写在一个真实的答案上吗?谢谢非常感谢你。。。我已经按照你的建议实施了,到目前为止,我对结果非常满意。明天上班时,我会用最后的代码更新这个问题,以帮助其他人在未来的研究中:)
public class GenericDAO
{
protected MyDatabaseDataContext dbMyDatabase
{
get
{
return HttpContext.Current.Items["myDatabaseDataContext"] as MyDatabaseDataContext;
}
}
}