Использовать DbContext в промежуточном программном обеспечении ActionFilter - PullRequest
0 голосов
/ 26 апреля 2018

Я хочу использовать DbContext в промежуточном программном обеспечении ActionFilter. Возможно ли это?

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");
            }
        }
    }
}

Но этот код using (var context = new SamuraiDbContext()) требует передачи параметров. Должен ли я снова пройти DbContextOptionsBuilder() здесь или есть какой-то другой способ?

Я хочу иметь атрибут [VerifyProfile] в моем методе контроллеров. Это возможно или нет?

1 Ответ

0 голосов
/ 26 апреля 2018

Вместо того чтобы пытаться создать новый экземпляр SamuraiDbContext самостоятельно, вы можете использовать Dependency Injection в своем фильтре. Для этого вам нужно сделать три вещи:

  1. Добавить конструктор к VerifyProfile, который принимает аргумент типа SamuraiDbContext, и сохранить его в виде поля.

    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()
        ...
    

Вы можете применить атрибут ServiceFilter на уровне действия, как показано, или на уровне контроллера. Вы также можете применять его в глобальном масштабе. Если вы хотите сделать это, вы можете заменить шаг 3 выше следующим:

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

В качестве дополнительного ресурса, это сообщение в блоге содержит описание некоторых других опций.

...