[英]ASP.NET MVC Search Page - Integer StartsWith On Linq + EF4
[英]When instantiate an EF4 context in ASP.NET MVC?
我在 microsoft asp.net website 中找到了一个教程,该教程从上下文中创建了一个实例,如下所示:
public class HomeController : Controller
{
private MoviesDBEntities _db = new MoviesDBEntities();
public ActionResult Index()
{
return View(_db.MovieSet.ToList());
}
...
}
这意味着每次 controller 实例化时,上下文也将被实例化。 但是在这里我发现实例化上下文的正确方法是这样的:
public class HomeController : Controller
{
public ActionResult Index()
{
using(MoviesDBEntities _db = new MoviesDBEntities()){
return View(_db.MovieSet.ToList());
}
}
...
}
所以问题是,哪种方式是正确的? 还是它很重要?
通常,class 不应该负责实例化自己的依赖项。
最好的办法是将依赖项传递给构造函数:-
public class HomeController : Controller
{
private IMovieRepository _db;
public HomeController(IMovieRepository db)
{
_db = db;
}
public ActionResult Index()
{
return View(_db.MovieSet.ToList());
}
}
这称为“依赖注入”,它是可取的,因为它减少了样板代码,并且还允许您在运行时提供其他 IMovieRepository 实现(例如,如果您进行单元测试)。
ASP.NET MVC 有一个钩子可以让你这样做(ControllerBuilder),但幸运的是你不需要自己动手,那里有预制的解决方案。 我推荐http://ninject.org/因为它很容易设置。
这样,您的 IoC 容器(无论传入什么依赖项)可以在每个 HTTP 请求中仅实例化一个上下文,并在请求结束时将其处理掉。
查看例如什么是控制反转?
这一切都是为了释放资源。
在有状态的情况下,对象更有可能寿命更长,因此使用语句最好在使用后立即处理上下文。
在无状态情况下(即 asp.net),服务器接收请求,生成结果,将其发送回并处理使用的资源(包括上下文)。
如果您知道几乎所有方法都可能在无状态情况下使用特定上下文,那么将其设置为字段并在 object 创建时实例化上下文会更容易一些,而不是在每个方法中都输入它。
第二种更好,因为 using 语句会在 IDisposable ObjectContext 自动退出 scope 时自动释放其消耗的资源。
在我看来,官方 asp.net 网站上的示例通常只是“工作”,而不是如何构建应用程序的好示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.