软件要求要求所有 DTO 包含自己的响应类。因此开发人员基本上将 Product DTO 包装在 Base Response 类中。我们有完整的类领域列表,需要数百个产品、销售、客户等类都在做同样的事情,如下所示。客户端不想包装,BaseResponse<Product> or BaseResponse<IEnumerable<ProductDto>
因为它是嵌套/不可读的。
是否有包装/创建变量类和可读的方法,而无需手动编写 100 个类(可能是扩展方法、动态类、变量,不确定,对任何方法开放)?
注意:响应类可以不同,所以要给程序员选择创建自动化标准类,或者创建自己定制的手动类,所以两个选项可以存在。
当前代码:
产品 DTO 类:
public class ProductDto
{
public int ProductId { get; set;},
public string ProductName { get; set;},
public string ProductDescription { get; set;},
public float SalesAmount { get; set;}
}
基本响应:
public class BaseResponse<T>
{
[Required, ValidateObject]
public T Body { get; set; }
public bool HasError { get; set; }
public string Error { get; set; }
}
个人回应:
public class GetAllProductResponse : BaseResponse<IEnumerable<ProductDto>>
{
}
public class GetProductResponse : BaseResponse<ProductDto>
{
}
public class UpdateProductResponse : BaseResponse<ProductDto>
{
}
建议代码:
public static class ResponseExtensions
{
public static BaseRequestResponse<T> GetAllResponse<T> (this T obj) where T:class
{
return BaseRequestResponse<IEnumerable<T>>;
}
public static BaseRequestResponse<T> GetResponse<T>(this T obj) where T : class
{
return BaseRequestResponse<T>;
}
public static BaseRequestResponse<T> UpdateResponse<T>(this T obj) where T : class
{
return BaseRequestResponse<T>;
}
}
所以代码现在看起来像这样,
ProductDTO.GetAllResponse
ProductDTO.GetResponse
ProductDTO.UpdateResponse
这是一个好方法,架构合理,还是应该应用其他方法?这可能不起作用,因为任何中间层发送/接收响应都需要引用为 BaseResponse< IEnumerable< ProductDto > 等。
顺便说一句,如果走这条路,这里会收到编译错误
'BaseRequestResponse<T>' is a type, which is not valid in the given context
更新: 这就是我们使用 DTO 和响应的方式
public async Task<ActionResult<GetProductResponse>> GetByProduct(int id)
{
try
{
var productdto = await productAppService.GetProductById(id);
var response = new GetProductResponse { Body = productdto };
return Ok(response);
}
catch (Exception ex)
{
logger.LogError(ex, ex.Message);
var response = new GetDocumentResponse { HasError = true, Error = ex.Message };
return StatusCode(StatusCodes.Status500InternalServerError, response);
}
}