我使用了一个基本控制器,它公开了DataBase
派生控制器可以访问的属性。
public abstract class BaseController : Controller
{
public BaseController()
{
Database = new DatabaseContext();
}
protected DatabaseContext Database { get; set; }
protected override void Dispose(bool disposing)
{
Database.Dispose();
base.Dispose(disposing);
}
}
我的应用程序中的所有控制器都源自BaseController
并使用如下:
public class UserController : BaseController
{
[HttpGet]
public ActionResult Index()
{
return View(Database.Users.OrderBy(p => p.Name).ToList());
}
}
现在回答你的问题:
我应该什么时候创建一个新的 DbContext / 我应该有一个可以传递的全局上下文?
应根据请求创建上下文。创建上下文,做你需要做的事情然后摆脱它。使用我使用的基类解决方案,您只需担心使用上下文。
不要尝试拥有全局上下文(这不是 Web 应用程序的工作方式)。
我可以拥有一个可以在所有地方重复使用的全局上下文吗?
不,如果你在它周围保留一个上下文,它将跟踪所有更新、添加、删除等,这会减慢你的应用程序速度,甚至可能导致一些非常微妙的错误出现在你的应用程序中。
您可能应该选择将存储库或上下文公开给控制器,但不能同时公开。如果两个上下文对应用程序的当前状态有不同的想法,那么从同一个方法访问两个上下文将导致错误。
就个人而言,我更喜欢直接公开DbContext
,因为我见过的大多数存储库示例最终都只是简单的包装DbContext
。
这会导致性能下降吗?
第一次DbContext
创建 a 非常昂贵,但是一旦完成,就会缓存很多信息,以便后续实例化更快。与每次需要访问数据库时实例化一个上下文相比,您更有可能看到保持上下文的性能问题。
其他人是怎么做到的?
这取决于。
有些人喜欢使用依赖注入框架在创建时将其上下文的具体实例传递给他们的控制器。两种选择都很好。我的更适合小型应用程序,您知道正在使用的特定数据库不会改变。
有些人可能会争辩说您不知道这一点,这就是依赖注入方法更好的原因,因为它使您的应用程序对更改更具弹性。我对此的看法是它可能不会改变(SQL 服务器和实体框架几乎不模糊),而且我的时间最好花在编写特定于我的应用程序的代码上。