2010-08-23 37 views
9

(Tôi đang sử dụng ASP.Net MVC, nhưng điều này có vẻ giống như một câu hỏi MVC chung hơn)Trong Asp.net MVC, có nên sử dụng chế độ xem để lấy được từ các mô hình miền không?

Giả sử bạn có mô hình miền đại diện cho một người và bạn có chế độ xem để chỉnh sửa một người. Bao gồm trong đối tượng miền Person là thuộc tính State of Residence, và trong khung nhìn bạn muốn một danh sách thả xuống liệt kê các trạng thái.

Có lý do gì để không tạo mô hình chế độ xem có nguồn gốc từ mô hình miền và chỉ đơn giản là bao gồm các thuộc tính cho giao diện người dùng mà chế độ xem yêu cầu không? Nếu vậy, tại sao không muốn làm điều này?

TIA

Trả lời

6

tôi sẽ nghĩ rằng phát sinh một mô hình nhìn từ một mô hình miền sẽ giới thiệu khớp nối mà MVC được dự định để tránh; Tuy nhiên, điều đó nói rằng, làm những gì làm cho ý nghĩa nhất cho ứng dụng của bạn.

Tôi muốn có các mô hình xem riêng biệt vì làm như vậy để tôi tự do thay đổi đáng kể mô hình miền và được cải thiện thời gian biên dịch hỗ trợ để remapping mô hình chế độ xem của tôi sang mô hình miền mới.

+3

"mô hình miền sẽ giới thiệu khớp nối mà MVC được dự định để tránh" Tuyên bố này không đúng. Triển khai Django/RoR trong đó các mô hình chế độ xem thực sự là các biểu diễn kết hợp chặt chẽ của lược đồ cơ sở dữ liệu. MVC không đưa ra ý kiến ​​về mô hình của bạn, chỉ là nó không thuộc V và C. – jfar

+0

Từ Wikipedia: Nhiều ứng dụng sử dụng cơ chế lưu trữ liên tục như cơ sở dữ liệu để lưu trữ dữ liệu. MVC không đề cập cụ thể đến lớp truy cập dữ liệu vì nó được hiểu là bên dưới hoặc được đóng gói bởi mô hình. Mô hình không phải là đối tượng truy cập dữ liệu; tuy nhiên, trong các ứng dụng rất đơn giản có ít logic miền thì không có sự phân biệt thực sự nào. Active Record là một mẫu thiết kế được chấp nhận hợp nhất mã miền và mã truy cập dữ liệu - một mô hình biết cách tự bảo vệ. – jfar

+0

@jfar: Điểm của bạn được thực hiện tốt; tuy nhiên, nhiều ví dụ của MVC sử dụng LINQ-to-SQL hoặc LINQ-to-Entities hoặc DataSets * làm * mô hình miền. Tất cả các mô hình này có ít nhất một số khớp nối với cơ chế lưu trữ liên tục, và được sử dụng làm mô hình (thường là đủ) trong thực tế. – kbrimington

2

Không, bạn thực sự không muốn thực hiện việc này.

Một phần lớn lý do để sử dụng Chế độ xem là do các thực thể miền của bạn có xu hướng to lớn, có nhiều gai nhọn, phức tạp và gắn với cơ chế kiên trì. Tất cả đều dẫn đầu cho họ có những hành vi kỳ lạ, thú vị hoặc phá hoại khi họ gặp phải những thứ như DefaultModelBinder.

Bằng cách sử dụng các lớp ViewModel đơn giản hơn nhiều, bạn có thể tránh phần lớn các vấn đề này trong khi cũng tách lớp UI của bạn khỏi mô hình miền của bạn.

Bây giờ, những gì bạn nên làm là cung cấp phương tiện dễ dàng để tạo ViewModel từ thực thể miền hoặc cập nhật thực thể miền từ một ViewModel.

+0

+1 để nhận xét về xu hướng của các thực thể miền bị ràng buộc với các cơ chế bền vững. Tôi thấy rằng với POCO cho một mô hình xem, tôi ít có khả năng gặp phải hành vi serialization kỳ lạ. – kbrimington

+0

Bạn có thể mở rộng nhận xét "những gì bạn nên làm là cung cấp phương tiện dễ dàng để tạo ra một ViewModel từ một thực thể tên miền hoặc để cập nhật một thực thể tên miền từ một ViewModel." Bạn có nghĩa là tổng quát? Viết một loạt các mã cập nhật thực thể cho mỗi viewmodel là một cái gì đó tôi muốn tránh trừ khi cần thiết. – erg39

+0

Bạn có thể thực hiện một số việc để giảm bớt công việc - chẳng hạn như AutoMapper - nhưng tùy thuộc vào khoảng cách các thực thể và mô hình chế độ xem của bạn phân tách, bạn có thể có một số mã thủ công để duy trì. –

7

Đây không phải là phương pháp được khuyến nghị và vì bạn đang yêu cầu bạn không nên làm điều đó. Câu trả lời ngắn gọn là tạo ra một mô hình xem duy nhất cho mỗi và mọi khung nhìn bạn sẽ render. Duy trì chế độ xem 1-1 để quan sát mô hình và khi bạn mã, bạn sẽ thấy lý do.

Câu trả lời dài có thể được tìm thấy ở đây amoung nơi khác http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx

Cảm ơn bạn,

R

+1

Tôi hiểu việc sử dụng chế độ xem, nhưng ngay cả liên kết bạn trích dẫn kết luận "Nếu bạn có thể liên kết trực tiếp với mô hình miền trong các trường hợp đơn giản, đó là giải pháp đơn giản và dễ nhất." Các kịch bản như trích dẫn trong bài viết gốc là hầu như không nhiều hơn những gì được chứa trong mô hình miền (mặc dù tôi không cho rằng nó có thể không sụp đổ nếu nó phát triển phức tạp). Tôi hiểu rằng nhiều người (nhất?) Cảm thấy có được một mô hình xem từ mô hình miền CRUD không phải là lý tưởng. Tôi chỉ không hiểu, nếu sử dụng tên miền đơn giản và dễ dàng nhất, thì tại sao lại như vậy. Cảm ơn. – erg39

-1

Tôi không đồng ý với hầu hết các lời khuyên ở đây.

Tôi nghĩ rằng mô hình miền của bạn phải sạch sẽ và mô hình chế độ xem sẽ hoạt động như thế nào. Nếu xem bạn cần một người và thời gian ở London tôi không thấy vấn đề với việc này:

ExampleViewModel : Person { 
Public DateTime LondonTime { get; set;} 
} 

Hoặc

AnotherViewModel 
{ 
Public Person SomeGuy { get; set;} 
Public List<Kitty> Cats{ get; set;} 
} 

Nếu xem bạn cần một người và một danh sách các chú mèo

Điều này giúp miền của bạn sạch sẽ; thời gian của London không liên quan đến một người tuy nhiên theo quan điểm của bạn, bạn vẫn cần có được dữ liệu. Đây là toàn bộ quan điểm của một mô hình xem imho.

+0

Ví dụ đầu tiên nên ưu tiên thành phần trên thừa kế – mathieu

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