2012-12-13 62 views
6

Tôi có một ứng dụng WPF mà trông giống như sau:WPF, MVVM, ICommand, và kho

enter image description here

ViewModel kết thúc tốt đẹp các mô hình và đưa ra bất kỳ thuộc tính liên quan đến xem qua INotifyChanged. Khung nhìn cũng bị ràng buộc với một số đối tượng ICommand xử lý hành vi nhất định được kích hoạt bởi khung nhìn. Tôi có một ICommand bên ngoài, mục đích duy nhất là lưu mô hình vào cơ sở dữ liệu.

Mọi thứ tôi đã đọc cho biết rằng chế độ xem hoặc chế độ xem mô hình phải có tham chiếu đến kho lưu trữ. Đây là lý do cho Command 3 nằm ngoài viewmodel.

Câu hỏi của tôi gấp hai lần. Đầu tiên, đây có phải là một kiến ​​trúc hợp lý không, và thứ hai, cách tốt nhất để lấy ví dụ mô hình qua lệnh 3 để nó có thể được đặt trong kho lưu trữ là gì?

+0

Làm thế nào chính xác là 'Command 1' và' Command 2' trong VM và 'Command 3' là OUT của VM? Không phải tất cả các lệnh được triển khai một cách riêng biệt trong các lớp riêng của chúng và chỉ cần thêm '' vào máy ảo làm các thuộc tính của nó? Trong bối cảnh này, làm thế nào là một lệnh TRONG VM và OUT khác của VM ?? –

Trả lời

8

Tôi, cá nhân, thấy không có vấn đề gì với việc ViewModel có tham chiếu đến kho lưu trữ. Cố gắng tránh điều này sẽ gây ra các biến chứng không cần thiết.

Trong MVVM, ViewModel thường là lớp "keo" nằm phía trên Mô hình của bạn - và Kho lưu trữ là một phần của Mô hình (đó là một phần của dữ liệu/logic của miền cụ thể). My blog series on MVVM shows a good image về cách Cá nhân tôi nghĩ về điều này:

MVVM Diagram

Cho công việc VM với Repository trực tiếp bằng cách đặt lệnh 3 vào VM có khả năng sẽ được sạch hơn là cố gắng để tách nó ra.

+0

Tôi chỉ cần thêm một chút vào những gì Reed nói: Bạn chắc chắn có thể tách rời nó bằng cách trừu tượng hóa các chi tiết của kho lưu trữ của bạn nếu bạn muốn. Nhưng tôi đồng ý, không có lý do gì để hoàn toàn tách biệt chúng theo cách sơ đồ hiển thị. – Tim

+0

@Tim Điểm tốt. Tóm tắt các chi tiết kho lưu trữ là rất hữu ích, nhưng gần như là một vấn đề riêng biệt (tuyệt vời cho testability, vv). –

+0

Tôi đồng ý rằng đó là một vấn đề riêng biệt, nhưng tôi tự hỏi liệu kiểu trừu tượng đó có phải là lý do đằng sau phiên điều trần OP rằng anh ta nên tách chúng ra. Chỉ muốn trả lời câu hỏi "Vậy thì tại sao [bất cứ ai] nói rằng tôi nên làm điều đó nếu tôi không cần?" câu hỏi trước khi anh ta hỏi nó! – Tim

0

Mô hình chế độ xem phải liên lạc với Lớp kinh doanh (Miền đối tượng + Dịch vụ miền) và không phải là kho lưu trữ trực tiếp. Hơn nữa, giao tiếp này nên được thực hiện thông qua lệnh.

Vì vậy, bạn có:

View -> Xem Người mẫu -> Command -> Tên miền Object/Dịch vụ Domain -> Repository

Trừ khi bạn đang phát triển một ứng dụng CRUD thực sự đơn giản ...