gpt4 book ai didi

c# - 在 ActionFilter 中间件中使用 DbContext

转载 作者:太空狗 更新时间:2023-10-30 00:22:50 25 4
gpt4 key购买 nike

我想在我的 ActionFilter 中间件中使用 DbContext。可能吗?

public class VerifyProfile : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
using (var context = new SamuraiDbContext())
{
var user = filterContext.HttpContext.User.Identity.Name;
if (context.Profiles.SingleOrDefaultAsync(p => p.IdentityName == user).Result == null)
{
filterContext.Result = new RedirectResult("~/admin/setup");
}
}
}
}

但此代码使用 (var context = new SamuraiDbContext()) 需要传递选项。我应该在这里再次传递 DbContextOptionsBuilder() 还是有其他方法?

我想在我的 Controller 方法中使用 [VerifyProfile] 属性。可不可以?

最佳答案

与其尝试自己创建一个新的 SamuraiDbContext 实例,不如使用 Dependency Injection在你的过滤器中。为此,您需要做三件事:

  1. 使用 SamuraiDbContext 类型的参数将构造函数添加到 VerifyProfile 并将其存储为字段:

    private readonly SamuraiDbContext dbContext;

    public VerifyProfile(SamuraiDbContext dbContext)
    {
    this.dbContext = dbContext;
    }
  2. 添加VerifyProfile到DI容器:

    services.AddScoped<VerifyProfile>();
  3. 使用 ServiceFilter 将过滤器连接到 DI 容器:

    [ServiceFilter(typeof(VerifyProfile))]
    public IActionResult YourAction()
    ...

您可以在操作级别(如图所示)或 Controller 级别应用 ServiceFilter 属性。您也可以在全局范围内应用它。为此,请将上面的第 3 步替换为以下内容:

services.AddMvc(options =>
{
options.Filters.Add<VerifyProfile>();
});

作为附加资源,this blog post对其他一些选项有很好的描述。

关于c# - 在 ActionFilter 中间件中使用 DbContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50041020/

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