Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq to sql 林克';数据上下文和;“工作单位”;图案我的方法行吗?_Linq To Sql_Design Patterns_Datacontext_Webforms_Unit Of Work - Fatal编程技术网

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;
        }
    }
}