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.
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de