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
Cảm ơn:) Chủ đề tốt đẹp – SDReyes