Bạn nghĩ sao? sao DAO của bạn trả về một IQueryable để sử dụng nó trong bộ điều khiển của bạn?ASP MVC: Các dịch vụ có nên trả về IQueryable không?
Trả lời
Hiện tại, nó nghe có vẻ hấp dẫn, nhưng really isn't.
No. Bộ điều khiển của bạn không được xử lý bất kỳ logic phức tạp nào cả. Giữ chúng mỏng; Mô hình (không phải DAO) sẽ đưa Bộ điều khiển trở lại mọi thứ cần thiết để truyền vào Chế độ xem.
Xem các truy vấn (hoặc thậm chí là truy vấn) trong lớp Bộ điều khiển là điều tôi sẽ coi là một mùi mã.
Cảm ơn Aaron, Nice point. Tuy nhiên, có một số ưu điểm của việc sử dụng IQueryable, như tính linh hoạt và khả năng bảo trì của dịch vụ - bởi vì giao diện DAO sẽ phát triển ít hơn khi sử dụng đường ống và mẫu bộ lọc. bạn nghĩ sao? – SDReyes
Mã spaghetti luôn luôn * có vẻ * dễ bảo trì hơn khi dự án còn nhỏ và nhỏ; khi dự án phát triển, tuy nhiên, bạn sẽ bắt đầu hối tiếc vì không có sự phân tách rõ ràng các mối quan tâm. – Aaronaught
Truyền IQueryable
Nếu bạn theo mô hình "mô hình béo, bộ điều khiển gầy" thì không.
Xem bài đăng này trên Fat Controller anti-pattern.
Cảm ơn Robert. :) – SDReyes
Tôi thích truyền IQueryable vào bộ điều khiển của mình vì tôi không phải tạo phương pháp phân trang và phân loại lame trong mọi phương thức và giao diện DAO duy nhất trong suốt quá trình phát triển ứng dụng của mình.
GetCustomersByLastname(string lastname)
nhanh chóng trở thành
GetCustomersByLastname(string lastname, string sortcolumn, int pagesize, int page)
Một lần nữa và một lần nữa và một lần nữa và một lần nữa. Bleck!
Với IQueryable, bạn có thể thực hiện phân trang và phân loại theo cách trực giao như tận dụng lợi thế của dự án IPagedList. Trả về IQueryable cũng cho phép bạn truy cập dễ dàng vào đối tượng tổng .Count() mà không có sự đảo lộn nhiều hơn về lớp dữ liệu của bạn.
@Robert s đối số của IQueryable bằng bộ điều khiển chất béo là rất run rẩy. Một bộ điều khiển chất béo sẽ tương tự như các trang .aspx.cs cồng kềnh. Nếu tất cả các bạn đang làm là kết nối với DAL của bạn và sau đó vận chuyển kết quả ra khỏi bạn không đạt được "chất béo" từ kỹ thuật truy vấn của bạn, bạn có được nó từ xô lô lôgic bên trong bên trong một lớp duy nhất. Bạn không nhận được Bộ điều khiển chất béo vì phương pháp truy cập dữ liệu của bạn trừ khi bạn bắt đầu ghi nhật ký, thông báo và các mối quan tâm trực giao khác bên trong.
public ActionResult Detail(string searchTerm)
{
var model = MyDAL.MyObjects(searchTerm);
}
vs:
public ActionResult Detail(string searchTerm)
{
var model = MyDAL.MyObjects.Where(x => x.Name == searchTerm);
}
tôi không thấy một sự khác biệt hấp dẫn.
@Mark Seemann câu trả lời là không kém phần run rẩy. Chắc chắn, bạn có thể thay đổi toàn bộ lớp dữ liệu của bạn ở giữa một dự án nhưng đó sẽ là một thảm họa phức tạp bất kể bạn trừu tượng ra sao. Ví dụ ông sử dụng là chuyển từ Linq2Sql sang bộ nhớ bảng của Windows Azure. RDBMS để lưu trữ khóa/giá trị? Và điểm đau là việc thực hiện Kho lưu trữ của bạn? Đi từ RDBMS đến một cửa hàng Key/Value là có được một số điên rồ thats sẽ được khủng khiếp không có vấn đề gì.
Đánh dấu cũng sẽ trả về Thiết kế Driven miền trong lập luận của anh ấy. Đó có phải là loại hệ thống tòa nhà của bạn không. Có đủ "Miền" hơn là các kịch bản CRUD thuần túy khiến cho phương pháp này có giá trị không? Nếu không thì tại sao lại bận tâm?
Sử dụng và LINQ và giao diện IQueryable cho bạn ít đau hơn khi chuyển đổi lớp dữ liệu. Nếu việc chuyển đổi giữa các ORM hỗ trợ LINQ và IQueryableProvider (tôi nghĩ đó là tên) hơn là chỉ mã hạ lưu quan tâm đến thay đổi đó. Bộ điều khiển của bạn sẽ giữ nguyên chuyển đổi giữa hầu hết các ORM trên thị trường hiện nay.
Nếu mục đích của việc này là sắp xếp và phân trang thì điều này có thể dễ dàng được thực hiện bằng giao diện 'IPager
Cũng lưu ý rằng mọi phân trang được thực hiện bằng cách sử dụng 'IQueryable
@Aaronaught Tôi đang đề cập đến thiết kế theo miền. Mô hình miền với tôi có nghĩa là ai đó đang sử dụng kỹ thuật DDD để xây dựng ứng dụng của họ. Tôi đã chỉ ra rằng những người ủng hộ câu trả lời liên quan đến Roberts đang làm điều gì đó vì lợi ích của DDD. Nếu bạn không sử dụng DDD hơn một số lý do cho việc trả lại IEnumerable
- 1. Lớp dịch vụ có nên trả về các kiểu xem cho một ứng dụng MVC không?
- 2. Dịch vụ của tôi nên trở về giao diện nào? IQueryable, IList, IEnumerable?
- 3. ASP MVC ChildActionOnly nên có định tuyến
- 4. ASP .NET MVC - Có phương pháp điều khiển trả về hình ảnh trong phản hồi không?
- 5. Các nguyên tắc SOA - một dịch vụ có nên gọi một dịch vụ khác không?
- 6. dịch vụ web sẽ trả về json
- 7. Silverlight POCO được các dịch vụ RIA trả về
- 8. Tôi có nên tiêm dịch vụ vào chế độ xem MVC của mình không?
- 9. Dịch vụ Góc có nên có trạng thái không?
- 10. Bạn có nên sử dụng dịch vụ web hoặc mvc Asp.net tốt hơn không?
- 11. Dịch vụ Nginx không thành công cho các yêu cầu miền chéo nếu dịch vụ trả về lỗi
- 12. ASP.NET MVC & Dịch vụ Web
- 13. Cách request.getPathInfo() trong phương thức dịch vụ trả về null?
- 14. WCF 4 dịch vụ REST không thể trả về một StatusDescription, chỉ có StatusCode
- 15. Asp .Net MVC ViewModel nên là lớp hoặc cấu trúc?
- 16. Dịch vụ WCF có nên đơn lẻ hay không?
- 17. Tôi có nên lưu chuỗi được NSLocalizedString() trả về không?
- 18. Lớp dịch vụ có nên được singleton trong java không?
- 19. Cách trả về JSON từ dịch vụ web asmx 2.0
- 20. Dịch vụ WCF trả về lỗi định dạng JSON
- 21. Trả về IQueryable trống như khi nào Rỗng?
- 22. Sử dụng Tài khoản dịch vụ, getAccessToken() trả về null
- 23. Dịch vụ WCF trả về "dịch vụ yêu cầu '...' không thể kích hoạt" lần đầu tiên truy cập từ trang MVC
- 24. Có một ASP MVC Equivalent cho require_once() của PHP không?
- 25. Có chấp nhận trả lại unmodifiableList hoặc tôi có nên trả về mảng không?
- 26. Phương thức nên trong API trả về Tác vụ kết thúc bằng Tác vụ hoặc Async
- 27. Các vấn đề về IQueryable khi sử dụng WCF
- 28. Gọi dịch vụ web REST từ trang asp cổ điển
- 29. Dịch vụ web có nên ném ngoại lệ HOẶC các đối tượng kết quả
- 30. Trả về dữ liệu không phải JSON, không phải trong Dịch vụ REST WCF
Cảm ơn:) Chủ đề tốt đẹp – SDReyes