New ApplicationDbContext()与HttpContext.GetOwinContext().Get<ApplicationDbContext>()有什么区别?

8

我有点困惑哪种方式更好,应该使用哪种。如果你总是能够得到 HttpContext.GetOwinContext().Get();那么为什么还要创建一个新的ApplicationDbContext,冒着对象重复等风险呢?

注意:我特别是在谈论 Web 应用程序。


请查看以下网址:http://blogs.microsoft.co.il/gilf/2010/02/07/entity-framework-context-lifetime-best-practices/ - haim770
“使用每个请求的上下文”意味着在Web应用程序中,我应该始终使用HttpContext.GetOwinContext().Get<ApplicationDbContext>();吗? - Fabis
一般来说,是的。除非有充分的理由不这样做。 - haim770
你有什么好的理由不这样做的例子吗? - Fabis
据我所知,您不应在应用程序中使用与身份框架相同的DbContext实例。它纯粹是供身份框架使用的...您应该通过其他方式(例如使用IoC容器注入)生成一个DbContext来使用,而不是在身份框架方法内部使用。 - Luke
此外,虽然您可以使用上述方法获取上下文的引用,但更好的方法是注入上下文实例,而不是以“服务定位器”模式请求它。在内部,您的IoC容器将为相同的请求返回相同的实例。请参见https://dev59.com/A2435IYBdhLWcg3w1jyV#5191797。 - haim770
2个回答

3
您在MVC应用程序内使用HttpContext.GetOwinContext().Get<ApplicationDbContext>();获取的DbContext实例可以专门为Identity Framework服务。
如果您需要在应用程序中通用使用DbContext实例,可以利用IoC容器(依赖注入)在需要时为您提供一个新的实例,并在请求范围内使用(如果需要)。
您不应该需要检索DbContext的身份框架实例来在应用程序中使用它,它将独立于您的应用程序进行管理,您可以管理自己的生命周期。
因为您在Owin Startup类中将其连接到了DbContext的实例,所以它们将在幕后使用它,并在需要时创建和销毁实例。

为什么还需要Request.GetOwinContext().Get<MyDbContext>();呢? - Toolkit
在应用程序中,如果我们需要直接使用DbContext对象进行操作,我们可以像之前提到的那样,使用'Get<T>'方法从OWIN上下文中获取该类的实例。同时请参考以下链接:https://blogs.msdn.microsoft.com/webdev/2014/02/12/per-request-lifetime-management-for-usermanager-class-in-asp-net-identity/ - Toolkit
你最终做了什么? - Luke
var db = HttpContext.Current.Request.GetOwinContext().Get<YourDbContext>(); 变量db = HttpContext.Current.Request.GetOwinContext().Get<YourDbContext>(); - Toolkit
很好。这是你在IoC容器中解决它的方式吗? - Luke
显示剩余4条评论

1
解决方案是在请求期间存储单个UserManager和DbContext实例,并在整个应用程序中重复使用它们。由于Identity通过cookie中间件连接到OWIN管道,我们可以将UserManager和DbContext存储在OWIN上下文对象中,并根据需要检索它们。此外,在应用程序中,如果我们需要直接使用DbContext对象,我们可以像之前提到的那样从OWIN上下文中获取该类的实例,使用“Get”方法即可。
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是一个轻量级对象。在单个请求中创建多个DbContext并不是错误的做法。在请求中使用两个DbContext也不是什么大问题。这还意味着您可以允许IoC容器智能地每个请求创建/销毁它。 - Luke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接