当在ASP中实例化EF4上下文时.净MVC

本文关键字:MVC 上下文 EF4 ASP 实例化 当在 | 更新日期: 2023-09-27 18:02:04

我在microsoft.net网站上找到了一个教程,从上下文中创建一个实例,像这样:

        public class HomeController : Controller
        {
            private MoviesDBEntities _db = new MoviesDBEntities(); 
            public ActionResult Index()
            {
                return View(_db.MovieSet.ToList());
            }
            ...
        }

这意味着每次控制器实例化时,上下文也将实例化。但是在这里,我发现实例化上下文的正确方法是这样的:

        public class HomeController : Controller
        {
            public ActionResult Index()
            {
                using(MoviesDBEntities _db = new MoviesDBEntities()){
                    return View(_db.MovieSet.ToList());
                }
            }
            ...
        }

那么问题是,哪个方向是正确的?或者它真的很重要吗?

当在ASP中实例化EF4上下文时.净MVC

一般来说,一个类不应该负责实例化它自己的依赖项。

最好的方法是将依赖项传递给构造函数:-

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请求只实例化一个上下文,并在请求结束时处理它。

检查例如:什么是控制反转?

这都是为了释放资源。

在有状态的情况下,对象更有可能存活更长时间,因此使用using语句最好在使用完上下文后立即处理它。

在无状态的情况下(如asp.net),服务器接收一个请求,生成一个结果,将它发送回来,并处理使用的资源(包括上下文)。

如果您知道几乎所有的方法都可能在无状态的情况下使用特定的上下文,那么将其作为一个字段并在对象创建时实例化上下文比在每个方法中键入上下文更容易一些。

第二个更好,因为using语句会在IDisposable ObjectContext自动超出作用域时自动释放它所消耗的资源。

在我看来,asp.net官方网站上的例子通常只是"工作",而不是如何构建应用程序的好例子。