Compartir a través de


RDG013: Atributos de origen no válidos

Valor
Identificador de la regla RDG013
La corrección es problemática o no problemática Poco problemático

Causa

El Generador de delegados de solicitudes emite este diagnóstico cuando un punto de conexión contiene un controlador de ruta con un parámetro que contiene una combinación no válida de atributos de origen de servicio.

Descripción de la regla

ASP.NET Core admite la resolución de servicios con clave y sin clave a través de la inserción de dependencias. No es factible resolver un servicio como con clave y sin clave. El código siguiente genera el diagnóstico y produce un error en tiempo de ejecución con el mismo mensaje:

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

Cómo corregir infracciones

Resuelva el parámetro de destino como un servicio con clave o sin clave.

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
{

}

Cuándo suprimir las advertencias

Esta advertencia no debe suprimirse. La supresión de la advertencia conduce a una excepción NotSupportedException en tiempo de ejecución The FromKeyedServicesAttribute is not supported on parameters that are also annotated with IFromServiceMetadata.