Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在MVC控制器中处理DbContext,哪种方式;更好;?_Asp.net Mvc_Entity Framework - Fatal编程技术网

Asp.net mvc 在MVC控制器中处理DbContext,哪种方式;更好;?

Asp.net mvc 在MVC控制器中处理DbContext,哪种方式;更好;?,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,在MVC 5中,脚手架代码有如下内容: public class MyController : Controller { private MyContext db = new MyContext(); protected override void Dispose(bool disposing) { if (disposing) { db.Dispose(); } base.

在MVC 5中,脚手架代码有如下内容:

    public class MyController : Controller
{
    private MyContext db = new MyContext();

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            db.Dispose();
        }
        base.Dispose(disposing);
    }
否则,我需要

using (var db = new MyContext())
{...}
在每一个动作中


代码看起来不错,所以我不需要在每个动作中使用。但是,这是否取决于程序员的偏好,或者这种样式比在需要使用dbcontext的每个操作中使用有一些优势?

using语句会自动调用using块末尾的Dispose()方法。Using语句调用Dispose()方法,即使代码中有错误。

两种解决方案都很好-两种解决方案都将Dispose db context。但在我看来,第二种选择会更好——您可以在需要的地方创建db上下文

但是如果另一个类(某些服务类)也使用db上下文呢。为整个web请求提供一个db上下文是一个很好的实践。在这种情况下,您应该将以前创建的db上下文传递给使用db上下文的所有类,以防止在所有类中创建新的db上下文。所以我会考虑使用IOC容器。IoC容器将解决您的依赖关系,还将管理对象生存期。吼叫

我列出了几个IoC容器:

  • 结构图

就最佳实践而言,您绝对应该使用模板搭建的东西,而不是使用(){}模式来破坏
,除非您有一些非常好的重写理由。两种解决方案产生相同的结果,但都不是好的解决方案。模板具有单个DbContext的原因是为了更容易测试-以下是一个示例:

public class SomeController : Controller
{
    private ApplicationDbContext db;

    public AccountController()
    {
        db = new ApplicationDbContext();
    }

    public AccountController(ApplicationDbContext context)
    {
        db = context;
    }
}
第一个没有参数的构造函数是在生产中使用的,它会根据app config文件自动创建一个新的db上下文。第二种方法允许您在进行单元测试时注入模拟的db上下文


归根结底,这个问题和我的答案并不是关于处理db上下文的,而是关于为什么代码模板设计者选择了他们所选择的方法,以及为什么它会帮助您。您应该进行单元测试。

对于简单场景,根本不需要调用Dispose(或使用):) “DbContext的默认行为是,基础连接在需要时自动打开,在不再需要时自动关闭。” 从这里开始:

两种解决方案产生相同的结果,但都不是好的解决方案。模板只有一个DbContext的原因是为了使它更容易测试,而这一点对于提出问题的人来说显然是没有意义的。您已经从不同的角度很好地解释了利弊。然而,有了使用,重构就更容易了。例如,在最近的一些项目中,我通过在DbContext之上有一个DAL使DbContext脱离了控制器,即使DbContext本身是一个DAL。这种方法使得控制器成为非常薄的传输层。如果我愿意,我可以通过WCF轻松交付相同的数据。