DTO 泛型列表
List of Generics for DTO
我正在 .Net Core 5 中构建 WebAPI 项目。输出始终是所有端点的分页结果。
因此我为分页输出创建了一个 DTO,如下所示:
public class PagedCommodityListDto
{
/// <summary>
/// The total number of items
/// </summary>
public int TotalItems { get; set; }
/// <summary>
/// The current page
/// </summary>
public int Page { get; set; }
/// <summary>
/// The list of paged items
/// </summary>
public List<CommodityDto> Items { get; set; }
}
如您所见,它包含端点返回的真实对象列表,在上面的示例中是 CommodityDto
Dto的使用和填写方式如下:
public static BusinessLogic.Dto.PagedCommodityListDto GetCommmodities(int page, ...)
{
//Query that extracts the values from the data layer
IQueryable<BusinessLogic.Dto.CommodityDto> commodities = MyQuery;
//Logic for the paging...
int totalItems = commodities.Count();
skip = (page - 1) * pageSize;
commodities = commodities.Skip(skip).Take(pageSize);
BusinessLogic.Dto.PagedCommodityListDto pcl = new BusinessLogic.Dto.PagedEconomicDataDto();
pcl.Items = commodities.ToList();
pcl.TotalItems = totalItems;
pcl.Page = page;
return pcl;
}
现在,我有或多或少的 30 个端点,我将它们添加到分页 DTO 的项目 属性 中,每个实体都有不同的 DTO,因为每个实体的属性都不同,因此30 个 DTO。
我的问题是:我是否必须为“分页容器”创建 30 个额外的 DTO,或者有办法使 public 列表项 { get ;放; } 通用?
请注意 API 必须有一个有效的 Swagger 以及控制器中每个方法的返回对象定义,如下所示:
[HttpGet]
[ApiVersion("1.0")]
[Route("List")]
[ProducesResponseType(typeof(BusinessLogic.Dto.PagedCommodityListDto), 200)]
public async Task<ActionResult> MethodName(....)
{
return Ok(Models.Repository.Commodity.GetCommmodities(page, ....));
}
你可以这样做
public class PaginationViewModel
{
public int PageNumber { get; set; }
public int PageSize { get; set; }
public int? TotalRecords { get; set; }
public int? TotalPages => TotalRecords.HasValue ? (int)Math.Ceiling(TotalRecords.Value / (double)PageSize) : (int?)null;
}
public class PagedResult<T>
{
public PagedResult(IEnumerable<T> results, int pageNumber, int pageSize, int? totalRecords)
{
Results = new List<T>(results);
PagingInfo = new PaginationViewModel
{
PageNumber = pageNumber,
PageSize = pageSize,
TotalRecords = totalRecords,
};
}
public List<T> Results { get; private set; }
public PaginationViewModel PagingInfo { get; set; }
}
然后你这样使用
var pagedResult = new PagedResult<your model>(your model, pageNumber, 20, totalRows);
我正在 .Net Core 5 中构建 WebAPI 项目。输出始终是所有端点的分页结果。
因此我为分页输出创建了一个 DTO,如下所示:
public class PagedCommodityListDto
{
/// <summary>
/// The total number of items
/// </summary>
public int TotalItems { get; set; }
/// <summary>
/// The current page
/// </summary>
public int Page { get; set; }
/// <summary>
/// The list of paged items
/// </summary>
public List<CommodityDto> Items { get; set; }
}
如您所见,它包含端点返回的真实对象列表,在上面的示例中是 CommodityDto
Dto的使用和填写方式如下:
public static BusinessLogic.Dto.PagedCommodityListDto GetCommmodities(int page, ...)
{
//Query that extracts the values from the data layer
IQueryable<BusinessLogic.Dto.CommodityDto> commodities = MyQuery;
//Logic for the paging...
int totalItems = commodities.Count();
skip = (page - 1) * pageSize;
commodities = commodities.Skip(skip).Take(pageSize);
BusinessLogic.Dto.PagedCommodityListDto pcl = new BusinessLogic.Dto.PagedEconomicDataDto();
pcl.Items = commodities.ToList();
pcl.TotalItems = totalItems;
pcl.Page = page;
return pcl;
}
现在,我有或多或少的 30 个端点,我将它们添加到分页 DTO 的项目 属性 中,每个实体都有不同的 DTO,因为每个实体的属性都不同,因此30 个 DTO。
我的问题是:我是否必须为“分页容器”创建 30 个额外的 DTO,或者有办法使 public 列表项 { get ;放; } 通用?
请注意 API 必须有一个有效的 Swagger 以及控制器中每个方法的返回对象定义,如下所示:
[HttpGet]
[ApiVersion("1.0")]
[Route("List")]
[ProducesResponseType(typeof(BusinessLogic.Dto.PagedCommodityListDto), 200)]
public async Task<ActionResult> MethodName(....)
{
return Ok(Models.Repository.Commodity.GetCommmodities(page, ....));
}
你可以这样做
public class PaginationViewModel
{
public int PageNumber { get; set; }
public int PageSize { get; set; }
public int? TotalRecords { get; set; }
public int? TotalPages => TotalRecords.HasValue ? (int)Math.Ceiling(TotalRecords.Value / (double)PageSize) : (int?)null;
}
public class PagedResult<T>
{
public PagedResult(IEnumerable<T> results, int pageNumber, int pageSize, int? totalRecords)
{
Results = new List<T>(results);
PagingInfo = new PaginationViewModel
{
PageNumber = pageNumber,
PageSize = pageSize,
TotalRecords = totalRecords,
};
}
public List<T> Results { get; private set; }
public PaginationViewModel PagingInfo { get; set; }
}
然后你这样使用
var pagedResult = new PagedResult<your model>(your model, pageNumber, 20, totalRows);