这只是一个证明我的问题的例子。控制器返回包装在我的结果类中的 DTO(带有通用数据、布尔状态和传递消息的字符串),因为我不想要状态代码结果。对象被序列化,然后反序列化并在客户端转换为适当的类型,因此据我所知,装箱/拆箱没有问题。在这种情况下使用对象作为返回类型有缺点吗?
[Authorize(Policy = "Everyone")]
[HttpGet("testDto")]
public async Task<object> GetDTO([FromBody]string name)
{
var dto = new TestDTO {
Number = 123,
Name = name,
Data = new List<string>() { "aaa", "bbb", "ccc" }
};
var result = _resultFact.Result<TestDTO>(dto, true, "* result mesage *");
return result;
}
邮递员:
我已经实现了多个 API 端点,并返回单个对象。
据我所知,除了对象列表之外,我没有看到任何缺点。如果对象列表很大,那么响应时间会更长。
这会起作用,但你会遇到我上面列出的一些潜在问题 1 - Swagger 等工具依赖方法签名来生成 API 文档。使用对象不会提供有关返回类型的有意义的详细信息,从而使 API 使用者更难理解所期望的内容 2 - 如果您的 DTO 包含派生或多态类型,序列化可能会变得很棘手。如果没有显式类型处理,序列化器可能会遇到问题 3 - 单元测试可能会变得更加麻烦,因为您每次都需要将返回的对象转换为其实际类型以验证其值。
如果你想使用泛型类型 user 而不是 object。我提供了一个例子,它可能有用:
public record Result<T>
{
public bool Success {get; init;}
public string? Message {get; init;}
public T Data {get; set;}
}
public async Task<ActionResult<Result<TestDTO>>> GetDTO([FromBody] string name)
{
var dto = new TestDTO
{
Number = 123,
Name = name,
Data = new List<string> { "aaa", "bbb", "ccc" }
};
var result = new Result<TestDTO>
{
Data = dto,
Status = true,
Message = "* result message *"
};
return Ok(result);
}