2010-04-13 20 views
7

Tôi có các dịch vụ không quốc tịch và các đối tượng miền thiếu máu ở phía máy chủ. Mô hình giữa máy chủ và máy khách là POCO DTO. Khách hàng sẽ trở thành MVVM. Mô hình có thể là đồ thị của khoảng 100 trường hợp của 20 lớp khác nhau. Trình chỉnh sửa khách hàng chứa các trang tab đa dạng, tất cả chúng đều được kết nối trực tiếp với mô hình/viewmodel.Mẫu MVVM: Cập nhật ViewModel sau khi máy chủ vòng tròn

Vấn đề của tôi là cách tuyên truyền thay đổi sau chuyến đi khứ hồi của máy chủ một cách tốt đẹp. Khá dễ dàng để truyền bá các thay đổi từ ViewModel sang DTO. Đối với cách trở lại nó sẽ có thể vứt bỏ DTO cũ và thay thế nó bằng một cái mới, nhưng nó sẽ gây ra rất nhiều vẽ lại cho danh sách/DataTemplates.

Tôi có thể thu thập các thay đổi phía máy chủ và truyền chúng sang phía máy khách. Nhưng tên của các trường thay đổi sẽ là miền/DTO cụ thể, không phải là ViewModel cụ thể. Và việc lập bản đồ dường như không có ý nghĩa với tôi. Nếu tôi nên làm theo cách bắt buộc sau chuyến đi khứ hồi, nó sẽ phá vỡ SOC/mô đun của viewModels.

Tôi đang suy nghĩ về một số loại công cụ quy tắc lập bản đồ, chẳng hạn như automappper hoặc phát ra bản đồ. Nhưng nó giải quyết các trường hợp sử dụng rất đơn giản. Tôi không thấy làm thế nào nó sẽ bản đồ/tuyên truyền/chuyển đổi thêm các mục vào danh sách hoặc loại bỏ. Cách xác định các cá thể trong bộ sưu tập để nó có thể hợp nhất các giá trị cho các cá thể hiện có. Cũng cần tuyên truyền thông tin xác thực/lỗi.

Có lẽ tôi nên triển khai INotifyPropertyChanged trên DTO và cố gắng phát lại các sự kiện phụ của máy chủ trên đó? Và sau đó ràng buộc ViewModel với nó? Sẽ ràng buộc giải quyết các vấn đề với bộ sưu tập hợp nhất cách tốt đẹp? EventAgregator từ PRISM có hữu ích cho điều đó không? Có bất kỳ thành phần ghi lại sự kiện phát lại nào không?

Có mô hình phía khách hàng tốt hơn cho kiến ​​trúc với logic phía máy chủ không?

Trả lời

1

Thông thường, tôi đã giữ tham chiếu đến DTO trong các lớp Mô hình của tôi. Đối với nhiều mô hình, tôi đảm bảo mỗi mô hình biết cách xây dựng chính nó từ một DTO, cũng như cách Tự lưu bằng cách sử dụng một "trình tiết kiệm" được tiêm hoặc đối tượng cung cấp dịch vụ khác. Thực hiện xung quanh một tham chiếu đến DTO làm cho nó khá dễ dàng, khi bạn gọi Save() trên mô hình, để sửa đổi DTO cũ theo Model trước khi chuyển nó trở lại dịch vụ. Hy vọng rằng bất kỳ "cập nhật" cho các đối tượng khác sau khi một Save() hoạt động có thể được truyền đạt trong DTOs khác, mà sau đó sẽ được nạp vào các mô hình thích hợp các lớp học được sử dụng bởi ViewModel của bạn. Quay lại đầu trang ||||||||||||||||||||||||||||||||||||

Nhược điểm của điều này là bạn thực sự phải viết mã ánh xạ, nhưng đây thường là phần dễ nhất. Tôi không tin đây là cách tốt nhất để làm mọi thứ và tôi sẽ đánh giá cao câu trả lời của người khác.

+0

Đây là phương pháp mặc định của tôi trong trường hợp này. Thông thường bản cập nhật sau khi Save() được kích hoạt thông qua sự kiện máy chủ, mỗi mô hình có thể tự cập nhật từ những thay đổi được kích hoạt bởi thay đổi DTO. –

0

Tôi đã sử dụng một biến thể khác với nhiều thành công. Chúng tôi có giao diện đồ họa thời gian thực, do đó việc vẽ lại lặp lại trên máy khách không được chấp nhận.

Chúng tôi đã làm cho DTO biết các thay đổi về thuộc tính của chúng và phát ra sự kiện PropertyChanged cho ViewModel, do đó phát lại sự kiện phía máy chủ.

Mã đơn giản để viết, kiểm tra đơn vị, v.v. Nó trở nên dễ dàng để duyệt khi PropertyChangeListeners (giao diện được thực hiện bởi ViewModels) được nhập.

Ranh giới này cũng có thể được sử dụng để chuyển chủ đề thành chuỗi công nhân GUI.

+1

Tôi e ngại về việc này.Giá trị của việc có DTO là họ có một mối quan tâm - chuyển dữ liệu trên một ranh giới dịch vụ - và có thể được tối ưu hóa cho mục đích đó. Không có phương thức nào, không có các hàm tạo tham số, không có sự kiện - đây là các mối quan tâm về đối tượng/mô hình miền. Tôi đã có một dự án WCF, nơi chúng tôi sử dụng các đối tượng miền của chúng tôi làm DTO. Nó hoạt động khá tốt, cho đến khi chúng ta cần logic khởi tạo để khởi tạo (mà không chạy vì WCF sử dụng khởi tạo thuộc tính). Loại điều này đã ném vào các mối quan tâm miền ngày càng ngu ngốc gây trở ngại cho DTO của chúng tôi và ngược lại. Yuk. –

+0

Bạn đã khiến tôi nhận ra dự án cụ thể của mình đã gặp may ... chúng tôi đã nhận được các yêu cầu xung đột thường xuyên giữa DTO và miền, nhưng chúng tôi có thể giữ chúng trực giao trong các lớp DTO. – louisgab

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