Injeção de dependência nos manipuladores de requisitos no ASP.NET Core

Os manipuladores de autorização devem ser registrados na coleção de serviços durante a configuração usando a injeção de dependência.

Suponha que você tinha um repositório de regras que queria avaliar dentro de um manipulador de autorização e que o repositório foi registrado na coleção de serviços. A autorização resolve e injeta isso no construtor.

Por exemplo, para usar a infraestrutura de registro em log do .NET, injete ILoggerFactory no manipulador, conforme mostrado no exemplo a seguir:

public class SampleAuthorizationHandler : AuthorizationHandler<SampleRequirement>
{
    private readonly ILogger _logger;

    public SampleAuthorizationHandler(ILoggerFactory loggerFactory)
        => _logger = loggerFactory.CreateLogger(GetType().FullName);

    protected override Task HandleRequirementAsync(
        AuthorizationHandlerContext context, SampleRequirement requirement)
    {
        _logger.LogInformation("Inside my handler");

        // ...

        return Task.CompletedTask;
    }
}

O manipulador anterior pode ser registrado com qualquer tempo de vida do serviço. O código a seguir usa AddSingleton para registrar o manipulador anterior:

builder.Services.AddSingleton<IAuthorizationHandler, SampleAuthorizationHandler>();

Uma instância do manipulador é criada quando o aplicativo é iniciado, e a DI injeta o ILoggerFactory registrado em seu construtor.

Observação

Não registre manipuladores de autorização que usando o EF (Entity Framework) como singletons.

Os manipuladores de autorização devem ser registrados na coleção de serviços durante a configuração usando a injeção de dependência.

Suponha que você tinha um repositório de regras que queria avaliar dentro de um manipulador de autorização e que o repositório foi registrado na coleção de serviços. A autorização resolve e injeta isso no construtor.

Por exemplo, para usar a infraestrutura de registro em log do .NET, injete ILoggerFactory no manipulador, conforme mostrado no exemplo a seguir:

public class SampleAuthorizationHandler : AuthorizationHandler<SampleRequirement>
{
    private readonly ILogger _logger;

    public SampleAuthorizationHandler(ILoggerFactory loggerFactory)
        => _logger = loggerFactory.CreateLogger(GetType().FullName);

    protected override Task HandleRequirementAsync(
        AuthorizationHandlerContext context, SampleRequirement requirement)
    {
        _logger.LogInformation("Inside my handler");

        // ...

        return Task.CompletedTask;
    }
}

O manipulador anterior pode ser registrado com qualquer tempo de vida do serviço. O código a seguir usa AddSingleton para registrar o manipulador anterior:

services.AddSingleton<IAuthorizationHandler, SampleAuthorizationHandler>();

Uma instância do manipulador é criada quando o aplicativo é iniciado, e a DI injeta o ILoggerFactory registrado em seu construtor.

Observação

Não registre manipuladores de autorização que usando o EF (Entity Framework) como singletons.