【问题标题】:How does it work the Session Per Request pattern?Session Per Request 模式是如何工作的?
【发布时间】:2017-06-19 14:02:17
【问题描述】:

我们正在开发一个使用 ASP.NET MVC4 的项目。在一次团队会议上,提出了使用 Session per request 的想法 模式。

我做了一些搜索,发现这里有一些问题,一般来说,这种模式(如果可能被调用)它被指示给框架 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. 在涉及事务时是否有可能出现并发问题?

【问题讨论】:

  • 每个请求的会话到底在哪个级别?是客户端到 Web 服务器、Web 服务器到应用程序服务器还是应用程序服务器到数据库/数据库服务器?我们需要更多信息才能提供建议。
  • Web 应用程序到数据库。
  • 如果您跟踪每种情况下对数据库执行的操作,您将看到差异。

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


【解决方案1】:

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

您可以查看 Radu Pascal 的这篇文章的简单实现:https://www.codeproject.com/Articles/243914/Entity-Framework-context-per-request

另一种实现(用于实体框架和 NHibernate),您可以在 ASP.NET 样板中找到更复杂的:http://www.aspnetboilerplate.com/Pages/Documents/Unit-Of-Work

【讨论】:

    【解决方案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 很有帮助。此外,如果您搜索 Single Context Per-Request,您会发现很多文章。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多