首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当在EF4 MVC中实例化ASP.NET上下文时?

当在EF4 MVC中实例化ASP.NET上下文时?
EN

Stack Overflow用户
提问于 2011-07-15 06:49:20
回答 3查看 603关注 0票数 2

我找到了微软asp.net网站教程,它从上下文中生成一个实例,如下所示:

代码语言:javascript
复制
        public class HomeController : Controller
        {
            private MoviesDBEntities _db = new MoviesDBEntities(); 

            public ActionResult Index()
            {
                return View(_db.MovieSet.ToList());
            }

            ...
        }

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

代码语言:javascript
复制
        public class HomeController : Controller
        {
            public ActionResult Index()
            {
                using(MoviesDBEntities _db = new MoviesDBEntities()){
                    return View(_db.MovieSet.ToList());
                }
            }
            ...
        }

所以问题是,哪条路是真的?或者说它是重要的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-15 07:22:46

通常,类不应该负责实例化自己的依赖项。

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

代码语言:javascript
复制
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容器(任何传递依赖项的内容)只能在每个请求中实例化一个上下文,并在请求结束时对其进行处理。

查看例如什么是控制反转?

票数 6
EN

Stack Overflow用户

发布于 2011-07-15 07:07:42

这一切都是为了释放资源。

在有状态的情况下,对象更有可能活得更长,因此在使用上下文后立即使用used语句更好。

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

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

票数 2
EN

Stack Overflow用户

发布于 2011-07-15 07:12:50

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6703597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档