它如何工作每个请求会话模式?

时间:2017-02-02 13:16:56

标签: c# asp.net asp.net-mvc session design-patterns

我们正在使用ASP.NET MVC4开发项目。在团队的一次会议中,出现了使用每个请求会话的想法 图案。

我进行了一些搜索,并在SO中发现了一些问题 - 一般来说 - 这种模式(如果可以称之为)它表示给框架ORM。

一个小例子

//GET Controller/Test

public ActionResult Test()
{
     //open database connection

     var model = new TestViewModel 
                 {
                      Clients = _clientService.GetClients(),
                      Products = _productService.GetProducts()
                 };

     //close database connection
     return View(model);
}

每个请求没有会话

//GET Controller/Test

public ActionResult Test()
{
     var model = new TestViewModel 
                 {
                      Clients = _clientService.GetClients(), // Open and close database connection
                      Products = _productService.GetProducts() // Open and close database connection.
                 };
     return View(model);
}

质疑

  1. 要进行上下文化,每个请求的会话如何工作?
  2. 这是一个很好的解决方案吗?
  3. 实施它的最佳方法是什么?在网络上打开连接?
  4. 是否建议在具有复杂查询/操作的项目中使用?
  5. 涉及交易时是否有可能出现并发问题?

2 个答案:

答案 0 :(得分:7)

看起来你的意思是“每个请求的数据库上下文”。您可以使用工作单元模式来实现它。

您可以在本文中检查Radu Pascal的简单实现:https://www.codeproject.com/Articles/243914/Entity-Framework-context-per-request

另一个实现(对于Entity Framework和NHibernate),您可以在ASP.NET Boilerplate中找到更复杂的内容:http://www.aspnetboilerplate.com/Pages/Documents/Unit-Of-Work

答案 1 :(得分:2)

在Web(Web应用程序,wcf,asp.net web api)中,每个请求使用一个DB上下文是个好主意。为什么?因为请求是短暂的,至少这是想法,或者您的应用程序响应时间很慢,因此创建许多数据库上下文没有意义。

例如,如果您使用EF作为ORM并向Find方法发出请求,则EF将首先在db上下文的本地缓存中搜索您要求的内容。如果找到它,它将简单地返回它。如果 没有找到,它将进入数据库并将其拉出并保存在缓存中。在您的Web应用程序完成请求之前,您多次查询相同项目的情况下,这可能非常有用。如果您创建一个上下文,查询某些内容,关闭上下文,那么您可能会多次访问数据库,这是可以避免的。

进一步详细说明,假设您创建了许多新记录:客户记录,订单记录,然后做一些工作,然后根据您为客户创建一些折扣记录的条件,然后是其他一些记录,然后是一些订单记录。如果您使用Single Context Per-Request方法,则可以继续添加它们并在结尾处调用SaveChanges。 EF将在一个事务中执行此操作:要么它们都成功,要么每个事物都被回滚。这很好,因为您在没有创建事务的情况下获得了事务性行为。如果你没有采用Single Context Per-Request方法,那么你需要自己处理这些事情。这并不意味着在Single方法中,一切都需要在一个事务中:您可以在同一个http请求中根据需要多次调用SaveChanges。考虑其他可能性,你拉一个记录,然后决定编辑记录,然后再编辑它:再次在Single方法中,它将全部应用于同一个对象,然后一次保存

除了上述内容之外,如果您还想阅读更多信息,那么您可能会发现this有帮助。此外,如果您搜索单个上下文每个请求,您会发现许多文章。