MVC应用程序中的静态类持久性

时间:2017-01-12 07:08:24

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

在过去的几个月里,我将我的Webforms知识迁移到MVC知识,我不得不说,在最初成为MVC怀疑论者后,我喜欢MVC及其工作方式。

我还有点不清楚的是静态类是如何在MVC中保留的。在Webforms中,静态类值在访问应用程序的不同客户端之间共享,如果您决定使用静态类来保存用户相关变量,则可能导致用户覆盖其他用户值。

我的第一个问题是MVC中是否仍然如此?

然后我的第二个问题是关于将DBContext实例保存在我的MVC应用程序中的位置。目前我将它作为静态DAL类中的公共变量。然后在所有客户端之间共享单个上下文。

我读到的越多,我就越开始相信这是不正确的方法,但重新创建每个控制器内的上下文似乎是重复的。

将Context置于静态类中是否存在缺点?

3 个答案:

答案 0 :(得分:1)

在应用程序的生命周期内保留单个 DbContext 实例对我来说听起来不是一个好主意。我通常每DbContext使用一个Request个实例。

在您的应用中确定DbContext的适当生命周期时,您可能需要考虑以下两点:

  1. 为多个请求重复使用相同的上下文可让您受益 缓存实体,你可以保存许多命中数据库但是 然后你可能会遇到性能问题,因为你可能最终会遇到问题 在某个时间将所有数据库实体都放在内存中。

  2. 另一方面,经常重新实例化上下文也不是 推荐,因为这是一项昂贵的操作。

  3. 您必须在这两种方法之间找到平衡点,对我来说,实例化DbContext 每次请求在大多数情况下效果最佳。

答案 1 :(得分:1)

DbConext不是线程安全的,EF只允许在同一个上下文中进行一次同步操作。因此,跨请求分享它并不是一个好主意。 在大多数情况下,每个请求的上下文是最佳解决方案。 (提示:有一些IoC框架,如autofac,可以为每个请求创建实例)

答案 2 :(得分:0)

上下文应该是短暂的,因此它可能看似重复,但是,是的,在每个控制器内部创建一个上下文。每个请求使用一个上下文是准确的。