11

Tôi không quen với mẫu MVC. Bạn có thể cho tôi biết một trong ba hành động điều khiển sau là tốt hơn không? Cảm ơn :)Có thực hành tốt để có truy vấn LINQ trong Bộ điều khiển không?

(1) Có truy vấn trong hành động:

public ActionResult List() 
{ 
    var query = repository.Query().Where(it => it.IsHandled).OrderBy(it => it.Id); 
    // ... 
} 

(2) Có truy vấn trong dịch vụ:

public ActionResult List() 
{ 
    var items = service.GetHandledItemsOrderById(); 
    // ... 
} 

(3) Có trật tự bởi trong hành động :

public ActionResult List() 
{ 
    var items = service.GetHandledItems().OrderBy(it => it.Id); 
    // ... 
} 

Nếu chúng ta chọn (1), thì chúng ta có quá nhiều logic nghiệp vụ trong bộ điều khiển?

Nếu chúng tôi chọn (2), có thể có nhiều phương thức dịch vụ như GetXXXByYYY().

Nếu chúng tôi chọn (3), tại sao chúng tôi đóng gói Where(it => it.IsHandled) nhưng không
OrderBy(it => it.Id.

Bất kỳ ý tưởng nào?

Trả lời

3

Điều đó tùy thuộc. :)

Ý kiến ​​của tôi:

Tôi muốn giữ dịch vụ của tôi lỏng lẻo, để giảm thiểu mã trùng lặp. Tôi cũng là một fan hâm mộ của đường ống và bộ lọc.

Đây là những gì tôi sẽ làm (và DO làm).

Dịch vụ

public ICollection<Item> GetHandledItems<TKey>(OrderingOptions<Item, TKey> orderingOptions) 
{ 
    return repository 
     .Query() 
     .WhereHandled() 
     .WithOrdering(orderingOptions) 
     .ToList();  
} 

ItemFilters.cs

public static IQueryable<Item> WhereHandled(this IQueryable<Item> source) 
{ 
    return source.Where(it => it.IsHandled); 
} 

public static IOrderedQueryable<T> WithOrdering<T, TKey>(
    this IQueryable<T> source, 
    OrderingOptions<T, TKey> orderingOptions) 
{ 
    return orderingOptions.SortDescending 
     ? source.OrderByDescending(orderingOptions.OrderingKey) :              
     source.OrderBy(orderingOptions.OrderingKey); 
} 

OrderingOptions.cs

public class OrderingOptions<T,TKey> 
{ 
    public OrderingOptions(Expression<Func<T,TKey>> orderingKey, bool sortDescending = false) 
    { 
     OrderingKey = orderingKey; 
     SortDescending = sortDescending; 
    } 

    public Expression<Func<T,TKey>> OrderingKey { get; private set; } 
    public bool SortDescending { get; private set; } 
} 

Bằng cách này, yo u có thể xác định thứ tự trong Bộ điều khiển:

var items = service.GetHandledItems(new OrderingOptions(it => it.Id)); 

Sự khác nhau giữa các bên trên và các tùy chọn 3:

  • Trên materializes chuỗi trước khi trở về Controller. Tùy chọn 3 không, đó là nguy hiểm (bạn có thể kết thúc trả về truy vấn để xem và phá vỡ mô hình MVC).
  • POCO "Đặt hàng" chung, có thể được sử dụng ở mọi nơi và giữ truy vấn của bạn D-R-Y.
  • Dịch vụ trở thành câm và chỉ đơn giản là một mitigator giữa Kho lưu trữ và Bộ điều khiển (đó là tất cả những gì cần làm, IMO). Logic (ví dụ: bộ lọc) được tóm tắt ở một nơi.

HTH

+0

Cảm ơn. Bu nếu "GetHandledItems()" trả về một bộ sưu tập (không phải IQueryable), chúng tôi không thể thực hiện các phép chiếu trên truy vấn. Nó sẽ ảnh hưởng đến hiệu suất. –

+0

@Dylan - Vì vậy, hãy dự đoán của bạn trong dịch vụ trước khi bạn thực hiện truy vấn, hoặc là nội tuyến hoặc thông qua một phương pháp khác, ví dụ: 'return repo.Query(). WhereHandled(). WithOrdering(). AsSomeProjectedType()' – RPM1984

+0

Đồng hồ ** tuyệt vời này ** RobCon vid trên MVC Ống & Bộ lọc: http://www.asp.net/mvc/videos/aspnet-mvc-storefront-part-3-pipes-and-filters – RPM1984

4

Tôi chắc chắn các ý kiến ​​có thể khác nhau, nhưng tôi đã học cách cố gắng giữ nhiều logic kinh doanh trong dịch vụ nhất có thể. 3 sẽ là sự lựa chọn của tôi. Với 1, bạn đã phát hiện vấn đề. Với 2, bạn đang giới thiệu ưu tiên hiển thị trong một dịch vụ. Với 3, bạn xử lý các tùy chọn hiển thị khi cần thiết. Nếu bạn giới thiệu một giao diện khác cho lớp doanh nghiệp của mình, bạn đang yêu cầu lặp lại mã không cần thiết, bằng cách chọn 2.

+0

Trang cần hiển thị các mục được lệnh xử lý theo Id. Tại sao "các mục hiển thị đã xử lý (đã xử lý)" là logic nghiệp vụ và phải trong dịch vụ, trong khi "các mục hiển thị theo thứ tự" là tùy chọn hiển thị? –

+0

Tôi nghĩ "hiển thị các mục được xử lý" và "các mục hiển thị theo thứ tự" là cả hai tùy chọn hiển thị? Vì vậy, chúng ta nên chọn 1? –

+1

Tôi nghĩ rằng câu hỏi của tôi nên là: (1) Có phải "Ở đâu (nó => it.IsHandled)" logic kinh doanh? (2) Có phải "OrderBy (it => it.Id)" logic nghiệp vụ không? –

Các vấn đề liên quan