RDG009: AsParameters aninhados inválidos
Valor | |
---|---|
ID da regra | RDG009 |
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 [AsParameters]
aninhado inválido.
Descrição da regra
Os tipos usados para associação substituta pelo atributo [AsParameters]
não devem conter tipos aninhados que também são anotados com o atributo [AsParameters]
:
using System.Text.Json.Serialization;
var builder = WebApplication.CreateSlimBuilder();
var todos = new[]
{
new Todo(1, "Write tests", DateTime.UtcNow.AddDays(2)),
new Todo(2, "Fix tests",DateTime.UtcNow.AddDays(1))
};
builder.Services.AddSingleton(todos);
builder.Services.ConfigureHttpJsonOptions(options =>
{
options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
});
var app = builder.Build();
app.MapGet("/v1/todos/{id}", ([AsParameters] TodoItemRequest request) =>
{
return request.Todos.ToList().Find(todoItem => todoItem.Id == request.Id) is Todo todo
? Results.Ok(todo)
: Results.NotFound();
});
app.Run();
struct TodoItemRequest
{
public int Id { get; set; }
[AsParameters]
public Todo[] Todos { get; set; }
}
internal record Todo(int Id, string Task, DateTime DueDate);
[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}
Como corrigir violações
Remova o atributo aninhado AsParameters
:
using System.Text.Json.Serialization;
var builder = WebApplication.CreateSlimBuilder();
var todos = new[]
{
new Todo(1, "Write tests", DateTime.UtcNow.AddDays(2)),
new Todo(2, "Fix tests",DateTime.UtcNow.AddDays(1))
};
builder.Services.AddSingleton(todos);
builder.Services.ConfigureHttpJsonOptions(options =>
{
options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
});
var app = builder.Build();
app.MapGet("/v1/todos/{id}", ([AsParameters] TodoItemRequest request) =>
{
return request.Todos.ToList().Find(todoItem => todoItem.Id == request.Id) is Todo todo
? Results.Ok(todo)
: Results.NotFound();
});
app.Run();
struct TodoItemRequest
{
public int Id { get; set; }
//[AsParameters]
public Todo[] Todos { get; set; }
}
internal record Todo(int Id, string Task, DateTime DueDate);
[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}
Quando suprimir avisos
Este aviso não pode ser suprimido.
Colaborar conosco no GitHub
A fonte deste conteúdo pode ser encontrada no GitHub, onde você também pode criar e revisar problemas e solicitações de pull. Para obter mais informações, confira o nosso guia para colaboradores.
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