Asp.net mvc 在MVC控制器中处理DbContext,哪种方式;更好;?
在MVC 5中,脚手架代码有如下内容: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.
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轻松交付相同的数据。