Внедрение контекста EF Core DB в обработчик пользовательских авторизаций - PullRequest
0 голосов
/ 09 октября 2019

Мне нужно использовать Entity Framework в моем собственном обработчике авторизации. Но это не работает. Это терпит неудачу во время выполнения. Я получаю эту ошибку в теле ответа:

<h2 class="stackerror">InvalidOperationException: Cannot consume scoped service &#x27;SomeDbContext&#x27; from singleton &#x27;Microsoft.AspNetCore.Authorization.IAuthorizationHandler&#x27;.</h2>

Я не могу ввести контекст БД, подобный этому. Как я могу использовать контекст БД в моем собственном обработчике авторизации?

В моем собственном классе обработчика авторизации:

public class CustomAuthorizationHandler : AuthorizationHandler<CustomAuthRequirement>
{
    private readonly SomeDbContext _dbContext;

    public CustomAuthorizationHandler(SomeDbContext context)
    {
        _dbContext = context;
    }

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomAuthRequirement requirement)
    {
        ...

        //Some datatable read operations with _dbContext

        ...
    }
}

В моем Startup.cs:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<SomeDbContext>(options =>
              options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection")));

        services.AddSingleton<IAuthorizationPolicyProvider, CustomAuthPolicyProvider>();

        services.AddSingleton<IAuthorizationHandler, CustomAuthorizationHandler>();

        ...
    }

1 Ответ

1 голос
/ 09 октября 2019

Вы можете просто ввести IServiceProvider serviceProvider в CustomAuthorizationHandler. Попробуйте использовать следующий код:

public class CustomAuthorizationHandler : AuthorizationHandler<CustomAuthRequirement>
{
    private readonly IServiceProvider _serviceProvider;

    public CustomAuthorizationHandler (IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                   CustomAuthRequirement requirement)
    {

        using (var scope = _serviceProvider.CreateScope())
        {
            var dbContext = scope.ServiceProvider.GetRequiredService<SomeDbContext>();

            //...
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...