2010-02-06 15 views

Trả lời

4

Hiện tại, nó nghe có vẻ hấp dẫn, nhưng really isn't.

+0

Cảm ơn:) Chủ đề tốt đẹp – SDReyes

5

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ã.

+1

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

+6

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

+2

Truyền IQueryable và/hoặc sử dụng ống và bộ lọc không bằng mã spaghetti. Mã spaghetti thường là bất khả tri về ngôn ngữ hoặc kỹ thuật. – jfar

2

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.

+0

Cảm ơn Robert. :) – SDReyes

4

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.

+4

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 ' kết thúc tốt hơn 'IQueryable ' nhưng vẫn xuất ra một mô hình miền. Tôi sử dụng cách tiếp cận này, nó đòi hỏi rất ít mã, và loại bỏ bất kỳ sự tương tác trực tiếp nào giữa bộ điều khiển và cơ sở dữ liệu. So sánh của bạn là lạ; có vẻ như dự án của bạn thiếu một mô hình miền, trong trường hợp này, tất nhiên không có nhiều khác biệt - nhưng nếu bạn không có một mô hình miền thì bạn không thực sự có MVC. – Aaronaught

+1

Cũng lưu ý rằng mọi phân trang được thực hiện bằng cách sử dụng 'IQueryable ' (tôi đoán đó là sự kết hợp của 'OrderBy' và' Skip' ở đây) sẽ không hiệu quả. Mặc dù nó có thể thuận tiện hơn để chơi với điều đó, phân trang hiệu quả thường đòi hỏi phải sử dụng SQL thô hoặc các thủ tục được lưu trữ, nhưng cũng không dễ dàng cho các bộ lọc/dự báo 'IQueryable '. – Aaronaught

+0

@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 thì không có ở đó. – jfar

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