【问题标题】:Separating paging, sorting and filtering分离分页、排序和过滤
【发布时间】:2017-12-08 12:13:41
【问题描述】:

在我的 ASP.NET MVC 应用程序中,我有一个服务,该服务具有对车辆品牌进行分页、排序和过滤的方法:

     public class VehicleService : IVehicleService
 {
     private readonly DbContext _context;

     public VehicleService(DbContext context)
     {
         _context = context;
     }

       public async Task<IPagedList<VehicleMake>> GetVehicleMakesWithPaginationAsync(string search, int? page, string sort)
    {
        var makes = _context.VehicleMakes.AsQueryable();

        switch (sort)
        {
            case "Name desc":
                makes = makes.OrderByDescending(x => x.Name);
                break;
            default:
                makes = makes.OrderBy(x => x.Name);
                break;
        }

        return await makes.Where(x => x.Name.StartsWith(search) || search == null).ToPagedListAsync(page ?? 1, 5);
 }
}

在查看我的代码后,有人告诉我排序、过滤和分页应该在具有接口的单独类中。我通过以下方式实现:

排序:

internal class Sorting : ISorting
{
    private readonly DbContext _context;

    public Sorting(DbContext context)
    {
        _context = context;
    }

    public IEnumerable<VehicleMake> SortMakes(string sort)
    {
        var makes = _context.VehicleMakes.AsQueryable();

        makes = sort == "Name desc" ? makes.OrderByDescending(x => x.Name) : makes.OrderBy(x => x.Name);
        return makes;
    }
}

分页:

class Paging : IPaging
{
    private readonly ISorting _sorting;

    public Paging(DbContext context)
    {
        _sorting = new Sorting(context);
    }

    public async Task<IPagedList<VehicleMake>> GetPagedListOfSortedMakes(string search, int? page, string sort)
    {
        var sortedMakes = _sorting.SortMakes(sort).AsQueryable();
        return await sortedMakes.Where(x => x.Name.StartsWith(search) || search == null).ToPagedListAsync(page ?? 1, 5);
    }
}

然后为我服务:

    public class VehicleMakeService : IVehicleMakeService
{
    private readonly DbContext _context;
    private readonly IPaging _paging;

    public VehicleMakeService(DbContext context)
    {
        _context = context;
        _paging = new Paging(context);
    }

    public async Task<IPagedList<VehicleMake>> GetVehicleMakesWithPaginationAsync(string search, int? page, string sort)
    {
        return await _paging.GetPagedListOfSortedMakes(search, page, sort);
    }
}

这很好用,但我不确定我是否正确实施。有没有更好(更清洁)的方法来做到这一点?

【问题讨论】:

  • 这似乎是一个很好的问题/与您的代码审查员讨论。优秀的代码审查员充当导师和教练,可以提供指导和推理。现在作为个人意见,虽然在某些情况下将功能提取到自己的类/接口中是必要的或可取的,但我不确定这是其中一种情况,或者我会这样做。但同样,与你的队友/建筑师/代码审查员进行讨论。祝你好运!
  • 你可以尝试在codereview.stackexchange.com问这个问题

标签: c# asp.net-mvc sorting filtering paging


【解决方案1】:

你不使用https://github.com/dncuug/X.PagedList的任何理由

这似乎是一个不错的组件。

【讨论】:

    猜你喜欢
    • 2018-01-13
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多