2010-01-02 50 views
6

Trong một số dự án mẫu, tôi đã thấy ViewModels được sử dụng để chuyển đổi đối tượng dữ liệu thành chuỗi, để sử dụng trong Chế độ xem.Chế độ xem và hiển thị

ViewModel thường sẽ có một hàm tạo nhận một tham số - một đối tượng dữ liệu. Các nhà xây dựng sau đó sẽ cư trú các thuộc tính khác nhau của ViewModel (chủ yếu là chuỗi và ints).

Điều này ngăn không cho bất kỳ logic phức tạp nào xảy ra trong Chế độ xem.

Thoạt nhìn, điều này có vẻ như là một ý tưởng hay đối với tôi, vì nó thực thi đầy đủ hơn việc tách Chế độ xem khỏi logic phức tạp. Ví dụ: giả sử chế độ xem của tôi đang cố gắng hiển thị thuộc tính 'Kích thước' của đối tượng dữ liệu, Kích thước là một số nằm trong khoảng từ 1 đến 3 đại diện cho 'Nhỏ/Trung bình/Lớn'.

Thay vì có câu lệnh if/switch trong quan điểm của tôi, tôi sẽ chỉ có một 'SizeString' hoặc một cái gì đó tương tự trong ViewModel của tôi và câu lệnh if/switch sẽ xuất hiện trong hàm tạo ViewModel.

Có ai không đồng ý với cách tiếp cận này không?

Sẽ tốt hơn nếu sử dụng một số cách tiếp cận khác, chẳng hạn như người trợ giúp? Và nếu có, tại sao?

Trả lời

6

Mục đích của ViewModel là đại diện cho (một phần của) Mô hình miền phức tạp bị phân tách thành các phần tử gốc có thể được hiển thị dưới dạng khác.

Quá trình phân hủy này phải diễn ra ở đâu đó. Nó có thể liên quan đến một số loại logic đơn giản, chẳng hạn như ví dụ yêu thích của tôi: chuyển đổi giá trị rời rạc (OK, cảnh báo, lỗi) thành màu (Xanh lá, Vàng, Đỏ). Đây là bản chất của những gì một ViewModel làm, do đó, cách tiếp cận mặc định của tôi sẽ được đóng gói logic này vào ViewModel chính nó.

Cân nhắc giải pháp thay thế: Nếu không được triển khai trong ViewModel thì ở đâu? Nếu bạn đặt logic ở một nơi khác, bạn kết thúc với một ViewModel về cơ bản chỉ là một cấu trúc không có logic. Để ViewModel đóng gói việc chuyển đổi/phân tách đối tượng miền phù hợp với Single Responsibility Principle.

Mặc dù đây là phương pháp mặc định của tôi, tôi luôn biết rằng có thể cần sử dụng lại logic trên nhiều Chế độ xem. Trong những trường hợp như vậy, đây có thể là dấu hiệu cho thấy ViewModel ban đầu thực sự là một ViewModel phức tạp được tạo thành từ một vài khung nhìn con. Trong những trường hợp như vậy, bạn có thể trích xuất logic thông thường thành một ViewModel phụ chỉ đóng gói phần nhỏ đó.

+0

Giải thích tốt. Lý do tôi không chắc chắn về điều này là tôi chắc chắn rằng tôi đọc ở đâu đó mà ViewModels chỉ nên là các đối tượng POCO đơn giản mà không có bất kỳ logic nào. Nhưng rõ ràng điều này sẽ không hiệu quả. Các ViewModels nên được phép chứa logic trình bày. – Jonathan

+0

POCO không loại trừ sự tồn tại của logic :) –

+0

Muốn viết về SRP, nhưng bạn đã làm điều đó. Như tôi luôn nói - thật khó để trở thành một võ sĩ quyền Anh và vũ công ballet cùng một lúc. :) –

2

Nó chuyển đổi mọi thứ thành chuỗi bởi vì mọi thứ trong web là một chuỗi.

Về cơ bản - mô hình xem được cho là ở trạng thái 'sẵn sàng để xuất'. Nếu web chỉ được tạo từ số - chúng tôi sẽ biến mọi thứ thành ints/decimals.

Toàn bộ quan điểmMô hình - để định dạng dữ liệu thể hiện được. Trong trường hợp của bạn - kích thước enum nhỏ/trung bình/lớn. Nó không phải là tách logic từ quan điểm làm cho điều này có giá trị - đó là khả năng để thông thạo dữ liệu của bạn cho web trong một cách, một nơi.


trả lời bình luận =>

Yeah, mà ngồi tốt. Tôi cũng làm như vậy. Nhưng điều cần đề cập - tôi không chống lại đưa điều đó vào quan điểm quá. Bởi vì lượt xem và mô hình xem là cuối cùng trong 'chuỗi phụ thuộc'. Tôi khá thực dụng và hoàn toàn chỉ chống lại các tình huống khi nhà phát triển sử dụng mô hình miền làm mô hình xem và yêu cầu cho mô hình xem xung đột với mô hình miền (tức là khi nhà phát triển thêm mới "đối tượng tên miền" chỉ cho mục đích đại diện).

+0

Thực ra tôi đã triển khai nó như là một Enum, nhưng tôi đã loại trừ thực tế đó để không vượt quá ví dụ. Tất nhiên, nếu tôi chỉ cho phép View trực tiếp truy cập Enum, vẫn sẽ có một số logic để chuyển đổi nó thành một chuỗi, như vậy: "Enum.GetName (...)". Vì vậy, tôi vẫn muốn trưng bày các tài sản như là một chuỗi trong ViewModel, và để cho ViewModel chăm sóc chuyển đổi enum-string. Điều này có phù hợp với bạn không? – Jonathan

+0

đã cập nhật câu trả lời của tôi ... –

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