在ASP.Net MVC的教程中,LINQ to Entities代码如下所示:
public class MyController : Controller
{
private Models db;
public ActionResult Index()
{
db = new Models();
var foo = (from f in db.foo select f).ToList();
return View(foo);
}
}
我猜这与线程安全/连接池有关,但我只是想知道是否有人知道有任何好的理由不这样做:
public class MyController : Controller
{
private readonly Models db = new Models();
public ActionResult Index()
{
var foo = (from f in db.foo select f).ToList();
return View(foo);
}
}
答案 0 :(得分:4)
我只是提出了一个非常详细的介绍。
您对线程的有根据的猜测只是为什么在需要它的方法中构造/处理Context通常更好的众多原因之一。
在某些情况下,这个经验法则不成立,但它们非常罕见。
请参阅:Tip 18 - How to decide on a lifetime for your ObjectContext
答案 1 :(得分:1)
从我见过的代码示例中,您应该编写您想要的代码,如下所示:
public class MyController : Controller{
public ActionResult Index()
{
using (var db = new Models())
{
var foo = db.Foo.ToList();
return View(foo);
}
}
}
这里有两个主要变化。
虽然您应该考虑整个应用程序架构,并考虑在控制器之外抽象数据访问。
答案 2 :(得分:1)
将其保留在方法中可确保db只在需要时进行实例化,并在需要时添加到连接池中。我甚至会采取下一步并在using语句中实例化它。
public class MyController : Controller
{
public ActionResult Index()
{
using (Models db = new Models())
{
var foo = (from f in db.foo select f).ToList();
return View(foo);
}
}
}
答案 3 :(得分:0)
第一个代码段不应该编译。您在不是构造函数的方法中分配只读字段。你确定它是一个MVC样本吗?