Compartilhar via


RDG013: atributos de origem inválidos

Valor
ID da regra RDG013
Correção interruptiva ou sem interrupção Sem interrupção

Causa

Este diagnóstico é emitido pelo Gerador de Representante de Solicitação quando um ponto de extremidade contém um manipulador de rotas com um parâmetro que contém uma combinação inválida de atributos de origem do serviço.

Descrição da regra

O ASP.NET Core dá suporte à resolução de serviços com chave e sem chave por meio da injeção de dependência. Não é viável resolver um serviço como com chave e sem chave ao mesmo tempo. O código a seguir produz o diagnóstico e gera um erro de tempo de execução com a mesma mensagem:

using System.Text.Json.Serialization;
using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateSlimBuilder(args);
builder.Services.ConfigureHttpJsonOptions(options =>
{
    options.SerializerOptions.TypeInfoResolverChain.Insert(0,
                                 AppJsonSerializerContext.Default);
});
builder.Services.AddKeyedSingleton<IService, FizzService>("fizz");

var app = builder.Build();

app.MapGet("/fizz", ([FromKeyedServices("fizz")][FromServices] IService service) =>
{
    return Results.Ok(service.Echo());
});

app.Run();

Como corrigir violações

Resolva o parâmetro de destino como um serviço com chave ou sem chave.

using System.Text.Json.Serialization;
using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateSlimBuilder(args);
builder.Services.ConfigureHttpJsonOptions(options =>
{
    options.SerializerOptions.TypeInfoResolverChain.Insert(0,
                                 AppJsonSerializerContext.Default);
});

builder.Services.AddKeyedSingleton<IService, FizzService>("fizz");
builder.Services.AddKeyedSingleton<IService, BuzzService>("buzz");
builder.Services.AddSingleton<IService, FizzBuzzService>();
var app = builder.Build();

app.MapGet("/fizz", ([FromKeyedServices("fizz")] IService service) =>
{
    return Results.Ok(service.Echo());
}); 

app.MapGet("/buzz", ([FromKeyedServices("buzz")] IService service) =>
{
    return Results.Ok(service.Echo());
}); 

app.MapGet("/fizzbuzz", ([FromServices] IService service) =>
{
    return Results.Ok(service.Echo());
});

app.Run();

public interface IService
{
    string Echo();
}

public class FizzService : IService
{
    public string Echo() => "Fizz";
}

public class BuzzService : IService
{
    public string Echo() => "Buzz";
}

public class FizzBuzzService : IService
{
    public string Echo()
    {
        return "FizzBuzz";
    }
}
[JsonSerializable(typeof(string[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{

}

Quando suprimir avisos

Este aviso não deve ser suprimido. Suprimir o aviso leva a uma exceção de runtime NotSupportedExceptionThe FromKeyedServicesAttribute is not supported on parameters that are also annotated with IFromServiceMetadata.