为什么要自定义返回值
统一返回格式。
你也可以在返回时主动映射到固定类型,但是每次都需要写重复代码。
实现IResult
public record CustomOkDto<T>(int Code, string? Message, T Data);
public class CustomOkResult<T>(CustomOkDto<T> dto) : IResult
{
private readonly CustomOkDto<T> dto = dto;
public async Task ExecuteAsync(HttpContext httpContext)
{
httpContext.Request.ContentType = "application/json";
httpContext.Response.StatusCode = 200;
await httpContext.Response.WriteAsJsonAsync(
dto,
AppJsonSerializerContext.Default.Options.GetTypeInfo(typeof(CustomOkDto<T>))
);
}
}
public static class ResultsExtensions
{
public static CustomOkResult<T> CustomOk<T>(
this IResultExtensions extensions,
CustomOkDto<T> dto
)
{
ArgumentNullException.ThrowIfNull(extensions);
return new CustomOkResult<T>(dto);
}
public static CustomOkResult<T> CustomOk<T>(
this IResultExtensions extensions,
T data,
int code,
string? message = default
)
{
ArgumentNullException.ThrowIfNull(extensions);
return new CustomOkResult<T>(new CustomOkDto<T>(code, message, data));
}
}
使用
TypedResults.Extensions.CustomOk(0, new { Name = "xxx"});
TypedResults.Extensions.CustomOk(1000, null, "用户名或密码错误");
总结
- 其实还是操作
HttpContext - 可以配合
枚举类对返回数据报错类型进一步约束 - 也考虑采用全局Filter实现自定义响应