【问题标题】:List of Generics for DTODTO 的泛型列表
【发布时间】: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&lt;T&gt; 并声明类型PagedList&lt;CommodityDto&gt;,但是如果没有看到更多代码,很难说该类是否实际上 是通用的。例如,内部实现是否取决于 Dto 的类型,还是实际上只是一个与 DTO 类型无关的分页列表?
  • @DStanley 我可以说这是不可知的,因为我返回对象就像它被创建一样,没有任何额外的逻辑。我要添加更多代码。
  • 一个简单的class PaginatedList&lt;T&gt; 和一个IQueryable&lt;T&gt; items,其中get 实现了分页。 return _list.Skip((page - 1) * pageSize).Take(pageSize);。以及 Page、PageSize、Total 等其他属性。

标签: c# .net asp.net-web-api dto


【解决方案1】:

你可以这样做

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    相关资源
    最近更新 更多