Tôi xin lỗi vì câu hỏi dài, nó đọc hơi khó hiểu, nhưng tôi hứa là không! Tôi đã tóm tắt (các) câu hỏi của tôi dưới đây
Trong thế giới MVC, mọi thứ rất đơn giản. Mô hình có trạng thái, Chế độ xem hiển thị Mô hình và Bộ điều khiển thực hiện / với Mô hình (về cơ bản), bộ điều khiển không có trạng thái. Để làm công cụ Bộ điều khiển có một số phụ thuộc vào dịch vụ web, kho lưu trữ, rất nhiều. Khi bạn khởi tạo một bộ điều khiển bạn quan tâm đến việc cung cấp các phụ thuộc đó, không có gì khác. Khi bạn thực thi một hành động (phương thức trên Bộ điều khiển), bạn sử dụng các phụ thuộc đó để truy xuất hoặc cập nhật Mô hình hoặc gọi một số dịch vụ miền khác. Nếu có bất kỳ bối cảnh nào, giả sử như một số người dùng muốn xem chi tiết của một mặt hàng cụ thể, bạn chuyển Id của mặt hàng đó làm tham số cho Hành động. Không nơi nào trong Bộ điều khiển có bất kỳ tham chiếu nào đến bất kỳ trạng thái nào. Càng xa càng tốt.
Nhập MVVM. Tôi yêu WPF, tôi thích ràng buộc dữ liệu. Tôi yêu các khung làm cho việc liên kết dữ liệu với ViewModels trở nên dễ dàng hơn (sử dụng Caliburn Micro atm). Tôi cảm thấy mọi thứ ít đơn giản hơn trong thế giới này mặc dù. Chúng ta hãy làm việc thực hiện một lần nữa: Model có nhà nước, Xem show ViewModel, và ViewModel làm công cụ để / với Model (cơ bản), một ViewModel không có nhà nước! (để làm rõ, có thể nó đại biểu tất cả các thuộc tính cho một hoặc nhiều mô hình, nhưng điều đó có nghĩa là nó phải có một tham chiếu đến các mô hình một cách này hay cách khác, đó là tình trạng của riêng mình) Để làmThứ ViewModel có một số phụ thuộc vào dịch vụ web, kho lưu trữ, rất nhiều. Khi bạn khởi tạo ViewModel, bạn quan tâm đến việc cung cấp các phụ thuộc đó, mà cả trạng thái. Và điều này, thưa quý vị và các bạn, làm phiền tôi đến tận cùng.
Bất cứ khi nào bạn cần khởi tạo một ProductDetailsViewModel
từ ProductSearchViewModel
(từ đó bạn gọi là ProductSearchWebService
lần lượt trả lại IEnumerable<ProductDTO>
, mọi người vẫn ở với tôi?), Bạn có thể thực hiện một trong những điều sau:
- Gọi
new ProductDetailsViewModel(productDTO, _shoppingCartWebService /* dependcy */);
, điều này là xấu, hãy tưởng tượng thêm 3 phụ thuộc, điều này có nghĩa là cũngProductSearchViewModel
cần phải có những phụ thuộc đó. Cũng thay đổi các nhà xây dựng là đau đớn. - Gọi
_myInjectedProductDetailsViewModelFactory.Create().Initialize(productDTO);
, nhà máy chỉ là một Func, chúng dễ dàng được tạo bởi hầu hết các khung IoC. Tôi nghĩ rằng điều này là xấu bởi vì các phương thức init là một sự trừu tượng bị rò rỉ. Bạn cũng không thể sử dụng từ khóa chỉ đọc cho các trường được đặt trong phương thức init. Tôi chắc chắn có một vài lý do nữa. - gọi
_myInjectedProductDetailsViewModelAbstractFactory.Create(productDTO);
Vì vậy ... đây là mô hình (nhà máy trừu tượng) thường được đề xuất cho loại vấn đề này. Tôi mặc dù nó là thiên tài vì nó thỏa mãn sự khao khát của tôi đối với việc gõ tĩnh, cho đến khi tôi thực sự bắt đầu sử dụng nó. Số lượng mã soạn sẵn là tôi nghĩ quá nhiều (bạn biết, ngoài các tên biến vô lý tôi sử dụng). Đối với mỗi ViewModel cần tham số thời gian chạy, bạn sẽ nhận được hai tệp bổ sung (giao diện xuất xưởng và triển khai) và bạn cần nhập các phụ thuộc không phải thời gian chạy như 4 lần thêm. Và mỗi lần thay đổi phụ thuộc, bạn cũng có thể thay đổi nó trong nhà máy. Có cảm giác như tôi thậm chí không sử dụng container DI nữa. (Tôi nghĩ Castle Windsor có một số giải pháp cho việc này [với những nhược điểm riêng, hãy sửa tôi nếu tôi sai]). - làm một cái gì đó với các loại ẩn danh hoặc từ điển. Tôi thích gõ tĩnh của tôi.
Vì vậy, vâng. Trộn lẫn trạng thái và hành vi theo cách này tạo ra một vấn đề hoàn toàn không tồn tại trong MVC. Và tôi cảm thấy như hiện tại không có một giải pháp thực sự thích hợp cho vấn đề này. Bây giờ tôi muốn quan sát một số điều:
- Mọi người thực sự sử dụng MVVM. Vì vậy, họ hoặc không quan tâm đến tất cả những điều trên, hoặc họ có một số giải pháp tuyệt vời khác.
- Tôi chưa tìm thấy một ví dụ chuyên sâu về MVVM với WPF. Ví dụ, dự án mẫu NDD đã giúp tôi hiểu một số khái niệm DDD. Tôi thực sự thích nó nếu ai đó có thể chỉ cho tôi hướng đi của một thứ tương tự cho MVVM / WPF.
- Có lẽ tôi đang làm sai MVVM và tôi nên đảo ngược thiết kế của mình. Có lẽ tôi không nên có vấn đề này cả. Tôi biết những người khác đã hỏi cùng một câu hỏi vì vậy tôi nghĩ tôi không phải là người duy nhất.
Tóm tắt
- Tôi có đúng không khi kết luận rằng việc ViewModel là một điểm tích hợp cho cả trạng thái và hành vi là lý do cho một số khó khăn với toàn bộ mẫu MVVM?
- Có phải việc sử dụng mẫu nhà máy trừu tượng là cách duy nhất / tốt nhất để khởi tạo ViewModel theo cách gõ tĩnh?
- Có một cái gì đó giống như một triển khai tham khảo chuyên sâu có sẵn?
- Có nhiều ViewModels với cả trạng thái / hành vi là mùi thiết kế không?