Freigeben über


RDG013: Ungültige Quellattribute

Wert
Regel-ID RDG013
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend

Ursache

Diese Diagnose wird vom Anforderungsdelegat-Generator ausgegeben, wenn ein Endpunkt einen Routenhandler mit einem Parameter enthält, der eine ungültige Kombination von Dienstquellattributen enthält.

Regelbeschreibung

ASP.NET Core unterstützt das Auflösen von schlüsselbasierten Diensten und nicht schlüsselbasierten Diensten über die Dependency Injection. Es ist nicht möglich, einen Dienst als schlüsselbasiert und nicht schlüsselbasiert aufzulösen. Der folgende Code erzeugt die Diagnose und löst einen Laufzeitfehler mit derselben Meldung aus:

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

Behandeln von Verstößen

Auflösen des Zielparameters als schlüsselbasierter oder nicht schlüsselbasierter Dienst.

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
{

}

Wann sollten Warnungen unterdrückt werden?

Diese Warnung sollte nicht unterdrückt werden. Das Unterdrücken der Warnung führt zu einer NotSupportedException-Laufzeitausnahme The FromKeyedServicesAttribute is not supported on parameters that are also annotated with IFromServiceMetadata..