Требования к программному обеспечению требуют, чтобы все DTO содержали свой собственный класс ответа.Таким образом, разработчики в основном включают Product DTO в класс Base Response.У нас есть полный список областей классов, требующих сотен классов для Продукта, Продажи, Клиента и т. Д., Которые делают одно и то же, как описано ниже.Клиент не хочет переносить как BaseResponse<Product> or BaseResponse<IEnumerable<ProductDto>
, так как он является вложенным / нечитаемым.
Есть ли метод для переноса / создания переменных классов и чтения, без ручной записи сотен классов (возможно, метод расширения, динамический класс, переменная(не уверен, открыт ли какой-либо метод)?
Примечание. Классы ответов могут быть разными, поэтому необходимо предоставить программисту возможность создавать автоматический стандартный класс или создать собственный настраиваемый ручной класс, чтобы существовали две опции.
Текущий код:
Класс DTO продукта:
public class ProductDto
{
public int ProductId { get; set;},
public string ProductName { get; set;},
public string ProductDescription { get; set;},
public float SalesAmount { get; set;}
}
BaseResponse:
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>;
}
}
Таким образом, код теперь будет выглядеть какthis,
ProductDTO.GetAllResponse
ProductDTO.GetResponse
ProductDTO.UpdateResponse
Это хороший метод, архитектурно обоснованный или следует применить что-то еще?Это, вероятно, не будет работать, так как любой ответ отправки / получения уровня среднего уровня должен будет называться BaseResponse и т. Д.
Кстати, если идти по этому маршруту, здесь появляется ошибка компиляции
'BaseRequestResponse<T>' is a type, which is not valid in the given context
Обновление: Так мы используем DTO и Response
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);
}
}