繁体   English   中英

在 ASP.NET MVC 中实例化 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM