2009-11-26 16 views
11

Bạn có thể đưa ra ví dụ về cách bạn sẽ sử dụng (khung hình DI) yêu thích của bạn để kết nối Mô hình Xem MVVM cho ứng dụng WPF không? Bạn sẽ tạo ra một hệ thống phân cấp mạnh mẽ của View Models (giống như nơi mà mỗi ViewModel của kiểm soát lồng nhau là một thuộc tính trên ViewModel của cha mẹ và bạn liên kết nó với DataContext của điều khiển lồng nhau trong XAML) hoặc bạn sẽ sử dụng một số loại -abstract "" Xem mô hình "Quản lý", mà duy trì một số hệ thống phân cấp kết nối yếu ... như trong CAB, có lẽ?Làm thế nào tôi có thể kết hợp MVVM và Dependency Injection trong một ứng dụng WPF?

Trả lời

6

Nếu mô hình chế độ xem chỉ có thể tồn tại cùng với một mô hình khác, tôi tạo mối quan hệ mạnh mẽ. Đó là mô hình xem sở hữu sẽ có tham chiếu trực tiếp đến một hoặc nhiều mô hình chế độ xem phụ thuộc. Nếu, mặt khác, một mô hình xem sẽ có thể tồn tại có hoặc không có một mô hình khác, tôi sử dụng một cách tiếp cận lỏng lẻo, nơi chúng giao tiếp thông qua một bus sự kiện.

Về mặt sử dụng DI với MVVM, tuyệt đối bạn có thể kết hợp cả hai. Nó đơn giản như:

public class MyViewModel 
{ 
    private readonly IMyDependency _myDependency; 

    public MyViewModel(IMyDependency myDependency) 
    { 
     _myDependency = myDependency; 
    } 
} 

Lưu ý, tuy nhiên, điều này giả định cách tiếp cận "xem mô hình đầu tiên" với MVVM.

+1

Tôi phải nói rằng tôi không phải là một fan hâm mộ lớn của 'hoạt động' ViewModels ... Thật khó để đưa ra một đối số một câu hợp lý cho điều này, nhưng tôi nghĩ rằng tôi đang ở trong 'ViewModels nên thụ động 'camp ... –

+1

Ý của bạn là gì bởi Mô hình Xem' hoạt động '/' thụ động ', Đánh dấu? –

+1

@Yacoder: Ví dụ của Kent Boogaart là một ViewModel 'hoạt động' vì nó cần một sự phụ thuộc, và người ta phải cho rằng nó có ý định sử dụng sự phụ thuộc đó một cách tích cực. Một ViewModel 'thụ động', mặt khác, là một trong những bạn tạo và điền dữ liệu, và một khi bạn đã làm điều đó, nó là khép kín. –

3

Trong WPF nó thường khá dễ dàng và nó không thực sự phụ thuộc vào bất kỳ DI Container cụ thể. Bạn đã đọc Josh Smith's article on MVVM chưa? Nó mô tả khá nhiều cách thiết lập một hệ thống phân cấp của ViewModels.

Những gì nó không đi sâu vào nhiều là làm thế nào để tạo ra những ViewModels từ phụ thuộc (chẳng hạn như kho), nhưng nó không phải là một ngoại suy khó khăn để làm.

Tôi thường có kinh nghiệm sử dụng tự do các Nhà máy Tóm tắt giúp khá nhiều về vấn đề này. Thay vì trực tiếp new'ing up ViewModels tôi cho một nhà máy tiêm làm điều đó cho tôi.

Bạn có thể sử dụng DI của người nghèo hoặc bất kỳ loại DI Container nào để kết nối các Nhà máy như vậy cho bạn.

+0

Chắc chắn tôi đã đọc bài báo, nhưng nó không ' t đi vào chi tiết về việc tạo và duy trì một bộ lớn hơn của ViewModels với một số phụ thuộc trong mỗi một. Tôi sợ câu trả lời của bạn không hữu ích đối với tôi ( –

+0

@Yacoder: Bạn sẽ ngạc nhiên khi có bao nhiêu người sử dụng thuật ngữ MVVM ở đây trên StackOverflow mà không cần đọc bài báo. –

+0

Thx cho con trỏ, đó là một bài viết tuyệt vời. – Mathias

1

Tôi đã xuất bản this article on Code Project về cách tạo ứng dụng WPF có thể mở rộng bằng MVVM và MEF để mở rộng. Tuy nhiên, nếu bạn nhìn kỹ, tôi cũng sử dụng MEF cho DI.

Ứng dụng này hoàn toàn là MVVM và chỉ sử dụng DataTemplates (và Cửa sổ không thường xuyên) cho Chế độ xem, giống như trong bài viết của Josh Smith. WPF quan tâm đến việc áp dụng Chế độ xem chính xác cho ViewModel phù hợp cho bạn. Thật ngọt ngào.

Nó sử dụng MEF để các phần có thể "tìm thấy" lẫn nhau. Vì vậy, ViewModel cho mục menu "View" tìm thấy tất cả các mục menu được cho là trong menu phụ sử dụng các điểm mở rộng, và ViewModels cho mỗi "tìm" "ViewModel" mà chúng được cho là sẽ giao cho trình quản lý bố cục bằng cách sử dụng điểm thành phần. Họ cũng "tìm" dịch vụ quản lý bố cục bằng cách sử dụng một bộ định vị dịch vụ thô sơ (MEF). Ví dụ menu View là gần như chính xác những gì bạn đang nói về với ViewModels lồng nhau. Điều thú vị là họ thậm chí không biết về nhau cho đến khi thời gian chạy.

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