2014-03-03 50 views
2

查看一些在线的MVC示例,我已经看到,通常在控制器中,DbContext变量被声明为私有成员变量(即全局)并且可以被所有方法访问。为MVC控制器声明DbContext

但是,我最近遇到了一篇关于ASP.NET身份的文章,并且在控制器中发现,DbContext在每个方法(需要它)内被声明为

这种方法是否有安全利益?也许为了更好的整体安全性而限制安全对象的寿命?!?!

如果没有,那么我会看到第一种方法更高效,其中数据库上下文在控制器加载时实例化。

以下是我能找到关于DbContext的所有信息,但没有真正回答我的问题。

DbContext declaration - Framework 4.1 - MVC 3.0

MVC, DbContext and Multithreading

回答

4

在每次请求中,控制器的新实例被构造。因此,对于所有意图和目的,dbcontext是否在构造函数中被实例化,是否在任何给定的方法中被封装并不重要。

从风格选择

除此之外,原因申报,并包含在一个给定的方法的DbContext是:

  • 方法不需要它不会实例化的背景下,消除了开销(如果有的话)。这也可以使用懒惰的初始化模式来完成。
  • 只要方法完成,环境立即处理,而不是在请求结束时处理。一般来说,这应该不是一个问题;通常如果用户在等待几秒钟以上,你会遇到更大的问题。
  • 不同的方法使用不同的上下文。

其中,一些理由来声明一个情境,一旦它实例:

  • 你只有一个地方,实例化一个方面,而不是很多。在典型的应用程序中,大多数页面无论如何都需要来自数据库的一些信息。
  • 调用其他方法的方法不会分别持有它们自己的上下文对象实例。
  • 您可以创建一个基本控制器类,默认情况下会创建一个dbcontext对象,允许您在所有继承的控制器中进行DRY。
1

Answer from @Ic。很不错。我想补充一点,如果您需要将您的请求中的信息传递给您的DbContext构造函数,那么您需要在您的动作方法中创建DbContext的实例。原因是Request对象将在控件进入您的操作方法之前为空。

更多信息:我需要根据用户的位置动态构建连接字符串。我将位置保存为一个通过Request对象访问的cookie。我在action方法中有一个有效的Request,但它在控制器的构造函数或类级属性中为null。