2017-12-07 5 views
0

In meiner ASP.NET MVC-Anwendung habe ich einen Dienst, der ein Verfahren zum Paging, Sortieren und Filtern von Fahrzeug Macht hatte:Paging-Trennung, Sortierung und Filterung

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

Nach der Überprüfung von meinem Code, ich war sagte, dass Sortieren, Filtern und Paging in separaten Klassen sein sollte, die Schnittstellen haben. Ich implementiert, dass in folgenden Weise:

Sortierung:

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

Paging:

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

Und dann in meinem Dienst:

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

Diese gut funktioniert, aber ich bin mir nicht sicher, ob ich imp bin lies das richtig. Gibt es einen besseren (saubereren) Weg, dies zu tun?

+0

Dies scheint eine gute Frage/Diskussion mit Ihrem Code-Reviewer. Ein guter Code-Reviewer fungiert als Mentor und Coach und kann Anleitung und Argumentation liefern. Nach meiner persönlichen Meinung, obwohl es Fälle gibt, in denen das Extrahieren einer Funktionalität in ihre eigene Klasse/Schnittstelle notwendig oder wünschenswert ist, bin ich nicht sicher, ob dies einer dieser Fälle ist, oder ich würde es so machen. Aber noch einmal, führen Sie eine Diskussion mit Ihrem Teamkollegen/Architekten/Code-Reviewer. Und viel Glück! –

+0

Sie könnten versuchen, diese Frage auf https://codereview.stackexchange.com/ –

Antwort

Verwandte Themen