Bạn có thể sử dụng bất kỳ mô hình nào bạn cảm thấy thoải mái, có tất cả các thuộc tính của bạn sẽ cần hành vi INotifyPropertyChanged. Làm thế nào điều này sẽ ảnh hưởng đến lớp dịch vụ hoàn toàn xuống đến thực hiện của bạn.
Tôi giả định rằng bạn cho rằng bạn ràng buộc với DTO trong chế độ xem của bạn?
Làm thế nào tôi thấy rằng có một sự không phù hợp trở kháng giữa các lớp của ứng dụng, đó là Mô hình miền của bạn có thể trông giống như mô hình quan hệ của bạn, với sự khác biệt tinh tế nhưng quan trọng. Ngoài ra còn có sự không khớp giữa Mô hình miền và DTO của bạn (đối tượng có thể được làm phẳng, tính chất được tính toán, v.v ...). Thật hấp dẫn để liên kết trực tiếp với DTO vì chúng có thể được thiết kế để có những gì bạn cần cho hoạt động cụ thể, tuy nhiên cũng có sự không phù hợp giữa DTO và những gì cần thiết cho khung nhìn để đạt được kết quả mong muốn. Mô hình khung nhìn có trách nhiệm ủy nhiệm các thuộc tính DTO cho khung nhìn, nó có trách nhiệm cho phép khung nhìn biết nếu có lỗi xác thực và các lệnh tuyến đến trình xử lý thích hợp (Lưu, Xóa, v.v. , ...).
Tôi có xu hướng thiết lập những điều theo cách sau:
// POCO object. Serializable.
public class AddressDto
{
public int Id { get; set; }
public string Street { get; set; }
public string City { get; set; }
public string Country { get; set; }
}
// IDataErrorInfo for validation.
public class AddressViewModel : INotifyPropertyChanged, IDataErrorInfo
{
private readonly AddressDto addressDto;
public AddressViewModel(AddressDto addressDto)
{
this.addressDto = addressDto;
}
public int Id { /* get and set for property changed event and update dto */ }
public string Street { /* get and set for property changed event and update dto */ }
public string City { /* get and set for property changed event and update dto */ }
public string Country { /* get and set for property changed event and update dto */ }
...
// IDataErrorInfo implementation
}
public class EditAddressViewModel : INotifyPropertyChanged
{
public AddressViewModel Address { /* get and set for property changed event */ }
public ICommand Save { /* setup command */ }
public ICommand Cancel { /* setup command */ }
private void Save()
{
}
private void Cancel()
{
}
}
EditAddressView của bạn sau đó sẽ liên kết với EditAddressViewModel. Về cơ bản, quy tắc là tất cả hành vi giao diện người dùng của bạn sẽ được thể hiện theo dạng xem của bạn.
Điều đó có nghĩa là thêm công việc, bạn có thể làm những việc bạn có thể làm để đơn giản hóa mọi thứ một chút (tạo mã v.v.). Tôi đang thực sự làm việc trên một thư viện nhằm mục đích đơn giản hóa toàn bộ quá trình MVVM bằng cách sử dụng một api thông thạo.Hãy khám phá tại số http://fluentviewmodel.codeplex.com/
Cảm ơn, có vẻ như không có sự nhất trí thực sự được xác định tại thời điểm này. Cho rằng bạn đã làm một điều tương tự trước khi không có vấn đề tôi sẽ chấp nhận điều này như là một câu trả lời. – JonC