我找到了微软asp.net网站教程,它从上下文中生成一个实例,如下所示:
public class HomeController : Controller
{
private MoviesDBEntities _db = new MoviesDBEntities();
public ActionResult Index()
{
return View(_db.MovieSet.ToList());
}
...
}这意味着每次控制器实例化,上下文也将被实例化。但是,这里 i被发现实例化上下文的正确方法如下:
public class HomeController : Controller
{
public ActionResult Index()
{
using(MoviesDBEntities _db = new MoviesDBEntities()){
return View(_db.MovieSet.ToList());
}
}
...
}所以问题是,哪条路是真的?或者说它是重要的?
发布于 2011-07-15 07:22:46
通常,类不应该负责实例化自己的依赖项。
最好的方法是将依赖项传递给构造函数:-
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容器(任何传递依赖项的内容)只能在每个请求中实例化一个上下文,并在请求结束时对其进行处理。
查看例如什么是控制反转?
发布于 2011-07-15 07:07:42
这一切都是为了释放资源。
在有状态的情况下,对象更有可能活得更长,因此在使用上下文后立即使用used语句更好。
在无状态情况下(即asp.net),服务器接收请求,生成结果,将其发回并处理使用的资源(包括上下文)。
如果您知道几乎所有的方法都可能在无状态情况下使用特定的上下文,那么让它成为一个字段并在创建对象时实例化上下文要比在每个方法中输入上下文要容易一些。
发布于 2011-07-15 07:12:50
第二个更好,因为using语句将在IDisposable ObjectContext自动退出作用域时自动释放它所消耗的资源。
在我看来,官方asp.net站点上的示例通常只是“工作”,而不是如何构建应用程序的好例子。
https://stackoverflow.com/questions/6703597
复制相似问题