【发布时间】:2021-03-01 15:06:00
【问题描述】:
我正在 .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;
}
现在,我在分页 DTO 的 Items 属性中添加了或多或少 30 个端点,每个端点都有不同的实体 DTO,因为每个实体的属性都不同,因此有 30 个 DTO。
我的问题是:我应该为“分页容器”创建 30 个额外的 DTO 还是有办法让公共列表项 { 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 PagedList<T>并声明类型PagedList<CommodityDto>,但是如果没有看到更多代码,很难说该类是否实际上 是通用的。例如,内部实现是否取决于 Dto 的类型,还是实际上只是一个与 DTO 类型无关的分页列表? -
@DStanley 我可以说这是不可知的,因为我返回对象就像它被创建一样,没有任何额外的逻辑。我要添加更多代码。
-
一个简单的
class PaginatedList<T>和一个IQueryable<T> items,其中get 实现了分页。return _list.Skip((page - 1) * pageSize).Take(pageSize);。以及 Page、PageSize、Total 等其他属性。
标签: c# .net asp.net-web-api dto