在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的动作中使用时都有一些优势?
答案 0 :(得分:7)
两种解决方案都很好 - 两种解决方案都将配置db上下文。但在我看来,第二个选项会更好 - 你只需要创建数据库上下文。
但是,如果另一个类(某些服务类)也使用db上下文呢?优良作法是为整个Web请求设置一个db上下文。在这种情况下,您应该将先前创建的db上下文传递给使用db context的所有类,以防止在所有clases中创建新的db上下文。所以我会考虑使用IoC容器。 IoC容器将解析您的依赖关系并且还将管理对象生存期。贝娄
我列出了几个IoC容器:
答案 1 :(得分:5)
对于简单的场景,根本不需要调用Dispose(或使用Using):) “DbContext的默认行为是底层连接在任何时候都需要自动打开,并在不再需要时关闭。” 从这里: http://blog.jongallant.com/2012/10/do-i-have-to-call-dispose-on-dbcontext/
答案 2 :(得分:1)
Using语句自动调用Using块末尾的Dispose()方法。即使代码中存在错误,Using语句也会调用Dispose()方法。
答案 3 :(得分:1)
就最佳实践而言,你绝对应该使用模板搭建的东西,而不是混淆using(){}
模式,除非你有一些非常好的首要原因。两种解决方案都产生相同的结果,但两者都不是好的解决方案。模板具有单个DbContext的原因是为了使测试更容易 - 这是一个例子:
public class SomeController : Controller
{
private ApplicationDbContext db;
public AccountController()
{
db = new ApplicationDbContext();
}
public AccountController(ApplicationDbContext context)
{
db = context;
}
}
第一个没有参数的构造函数是在生产中使用的构造函数,它根据应用程序配置文件自动创建新的db上下文。第二个允许您在进行单元测试时注入模拟的db上下文。
在一天结束时,这个问题和我的回答并不是关于处理数据库上下文 - 它是关于为什么代码模板设计者选择采用他们所做的方法以及它为什么会帮助你。您应read more on进行单元测试。