【问题标题】:New ApplicationDbContext() vs HttpContext.GetOwinContext().Get<ApplicationDbContext>();新 ApplicationDbContext() 与 HttpContext.GetOwinContext().Get<ApplicationDbContext>();
【发布时间】:2015-07-21 16:24:21
【问题描述】:

我对哪种方式更好以及使用哪种方式有点困惑。当然,如果你总能得到 HttpContext.GetOwinContext().Get();那为什么还要创建一个新的 ApplicationDbContext 并冒险将对象加倍等?

注意:我在这里专门讨论的是 Web 应用程序。

【问题讨论】:

  • 所以“使用每个请求的上下文”意味着至少在 Web 应用程序中我应该始终使用 HttpContext.GetOwinContext().Get();?
  • 一般来说是的。除非有充分的理由不这样做。
  • 你有一个例子说明什么是不这样做的充分理由吗?
  • 据我所知,您不应该在应用程序中使用与身份框架相同的 DbContext 实例。它纯粹供 Identity Framework 使用...您应该通过 Identity Framework 方法之外的其他方式生成 DbContext(即,在使用 IoC 容器时注入它)。

标签: c# asp.net asp.net-mvc entity-framework asp.net-identity


【解决方案1】:

您在 MVC 应用程序中创建并可使用 HttpContext.GetOwinContext().Get&lt;ApplicationDbContext&gt;(); 检索的 DbContext 实例可以专供 Identity Framework 使用。

如果您需要一个 DbContext 实例在您的应用程序中通用,您可以使用 IoC 容器(依赖注入)在需要时为您提供它的新实例,并在需要时在请求范围内提供。

您不应该需要检索 DbContext 的身份框架实例以在您的应用程序中使用,它将独立于您的应用程序进行管理,您可以管理自己的生命周期。

因为您在 Owin Startup 类中将它们连接起来以使用 DbContext 的实例,所以它们将在后台使用它,并在需要时创建和销毁实例。

【讨论】:

  • 但有时我需要在一个事务中创建一个用户并将他的 ID 插入到某些表中,否则我会失去数据完整性。怎么办?
  • 为什么是 Request.GetOwinContext().Get();甚至存在吗?
  • 如果您在登录过程中需要做一些特别的事情,您应该创建一个 IUserStore 的自定义实现并将其附加到您的身份设置中。至于使用身份使用的 DbContext,您应该像使用任何应用程序一样自己创建和管理 DbContext 的生命周期,这样它的创建和销毁是可预测的。您不希望在需要使用身份 DbContext 之前对其进行处置。我希望这会有所帮助。
  • 你确定吗?? “解决方案是为每个请求存储一个 UserManager 和 DbContext 实例,并在整个应用程序中重用它们。由于 Identity 通过 cookie 中间件连接到 OWIN 管道,我们可以将 UserManager 和 DbContext 存储在 OWIN 上下文对象中并根据需要检索它们。”
  • 和“同样在应用程序中,如果我们需要直接使用 DbContext 对象,我们可以使用前面提到的 'Get' 方法从 OWIN 上下文中获取类的实例”@ 987654321@
【解决方案2】:

解决方案是为每个请求存储一个 UserManager 和 DbContext 实例,并在整个应用程序中重用它们。由于 Identity 通过 cookie 中间件连接到 OWIN 管道,我们可以将 UserManager 和 DbContext 存储在 OWIN 上下文对象中并根据需要检索它们

同样在应用程序中,如果我们需要直接使用 DbContext 对象,我们可以使用前面提到的“Get”方法从 OWIN 上下文中获取类的实例

var dbContext = context.Get<ApplicationDbContext>();

来自https://blogs.msdn.microsoft.com/webdev/2014/02/12/per-request-lifetime-management-for-usermanager-class-in-asp-net-identity/

【讨论】:

  • 我想我宁愿坚持把它们分开。 DbContext 毕竟是lightweight object。在一个请求中创建多个不是错误。在一个请求中一个接一个地使用两个 DbContext 没什么大不了的。这也意味着您可以让您的 IoC 容器根据请求智能地创建/销毁它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 2017-07-28
  • 2016-07-15
  • 2015-05-17
相关资源
最近更新 更多