RDG007:找不到有效的构造函数

规则 ID RDG007
修复是中断修复还是非中断修复 非中断

原因

当终结点包含一个路由处理程序,且该路由处理程序的参数通过未包含有效构造函数的 [AsParameters] 属性进行批注时,请求委托生成器将发出此诊断。

规则说明

通过 AsParameters 属性用于代理项绑定的类型必须包含公共构造函数。 TodoRequest 类型将生成此诊断,因为没有公共构造函数。

using System.Text.Json.Serialization;

var builder = WebApplication.CreateSlimBuilder(args);

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

var app = builder.Build();

app.MapPut("/v1/todos/{id}", ([AsParameters] TodoRequest request)
    => Results.Ok(request.Todo));

app.Run();

public class TodoRequest
{
    public int Id { get; set; }
    public Todo Todo { get; set; }
    
    private TodoRequest()
    {
    }
}

public record Todo(int Id, string Task);

[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{

}

如何解决冲突

删除非公共构造函数,或添加新的公共构造函数。

using System.Text.Json.Serialization;

var builder = WebApplication.CreateSlimBuilder(args);

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

var app = builder.Build();

app.MapPut("/v1/todos/{id}", ([AsParameters] TodoRequest request)
    => Results.Ok(request.Todo));

app.Run();

public class TodoRequest(int Id, Todo todo)
{
    public int Id { get; set; } = Id;
    public Todo Todo { get; set; } = todo;
}

public record Todo(int Id, string Task);

[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{

}

何时禁止显示警告

无法安全消除此警告。 取消时,会导致 InvalidOperationException 运行时异常。