gpt4 book ai didi

c# - DbContext 在多个 Controller 中使用 - 怎么做?

转载 作者:行者123 更新时间:2023-11-30 20:39:20 25 4
gpt4 key购买 nike

我的上下文在两个 Controller 中使用(AdminController 可以查看和添加一些数据,HomeController 只能查看数据)。

我可以让我的上下文类只是我的 Controller 类中的字段吗?或者我应该把它变成单例吗?或者我应该创建一个额外的单例类来存储我网站中的所有 DbContext 类吗?应该如何正确完成?

最佳答案

每个 HTTP 请求的上下文

我相信 ASP.NET MVC 的最佳方式是每个请求使用 1 个 DbContext。您将从这种方法中受益,因为:

  1. 您无需关心上下文中的对象,因为上下文是唯一的,因此如果它们来自不同的上下文,则无需附加实体。
  2. 您不必手动处理上下文。虽然必须处理上下文,但我们会在处理请求时在一个地方处理。
  3. 您在一个地方创建上下文。这是一个很好的单元测试抽象。

当然你可以使用 IoC 容器,但我不喜欢开销,因为你可以轻松地自己编写所有必要的逻辑。


所以我们需要一个DbContext 的包装器。它会将您的 EF 上下文保存在 HttpContext 项中。在 ASP.NET MVC 应用程序中,您可以将初始化放在基本 Controller 中:

public class DbContextHelper : IDbContextHelper // interface for testing if you need it
{
private const string contextKey = "MyContext";

public MyContext GetContext()
{
if (HttpContext.Current.Items[contextKey] == null)
{
HttpContext.Current.Items.Add(contextKey, new MyContext());
}

return (MyContext) HttpContext.Current.Items[contextKey];
}

public void DisposeContext()
{
if (HttpContext.Current.Items[contextKey] != null)
{
var context = (MyContext) HttpContext.Current.Items[contextKey];
context.Dispose();
}
}
}

现在要完成设置,我们需要将 DisposeContext 调用注入(inject) End_Request 事件。这取决于您使用的 ASP.NET 版本。通常我会创建一个处理上下文的 ActionFilter。并在全局注册。

public class DisposeDbContextFilterAttribute : ActionFilterAttribute
{
private static readonly DbContextHelper contextHelper = new DbContextHelper();

public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
contextHelper.DisposeContext();
}
}

现在,当一切都设置好后,就可以尽情使用了:

var user = contextHelper.GetContext().Users.Find(userId);

关于c# - DbContext 在多个 Controller 中使用 - 怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34440816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com