Tôi nên sử dụng khung nào cho MVVM? [đóng cửa]


233

Tôi đang phát triển một ứng dụng với mô hình MVVM, nhưng tôi đã đạt đến một điểm mà tôi cần chọn sử dụng khung công tác nào.

Trong số các tùy chọn có thể là:

  • Bộ công cụ MVVM
  • Quỹ MVVM
  • Khung ứng dụng WPF (WAF)
  • MVVM nhẹ
  • Caliburn
  • Cinch
  • Lăng kính
  • Phản ứng

Theo kinh nghiệm của bạn, cái nào tốt hơn?


14
+1 - Câu hỏi hay, nhưng vui lòng làm rõ 'tốt hơn'. Các khung khác nhau cung cấp các lợi thế khác nhau, tốt nhất phụ thuộc vào yêu cầu của bạn. Rất mong nhận được câu trả lời :)
Russell

Chà, sẽ rất tốt nếu bạn có thể sử dụng với WPF và Silverlight, và với một đường cong học tập tối thiểu.
Rangel

2
Bạn có thể muốn kiểm tra Caliburn quá. codeplex.com/caliburn
Kent Boogaart

Xin lỗi Kent. Làm thế nào tôi có thể quên Caliburn?
Pete OHanlon

2
Gần và cũ nhưng ... Tôi đã thực hiện dự án đầu tiên của mình bằng Prism (câu trả lời bên dưới) vì tôi cần hỗ trợ thành phần. Dự án cuối cùng của tôi tôi đã làm thô - không có khung nào cả. Tất cả những gì bạn cần là một lớp lệnh và bạn có thể thực hiện MVVM mà không cần khung - đó là về trọng lượng nhẹ như bạn có thể nhận được.
dave

Câu trả lời:


194

Nó thực sự phụ thuộc vào những gì bạn đang cố gắng đạt được, và bạn muốn có bao nhiêu cơ sở hạ tầng, cộng với sự dễ dàng mà bạn có thể tìm thấy các mẫu giúp bạn. Tôi sẽ tuyên bố mối quan tâm ở đây, vì tôi đã tích cực tham gia vào ít nhất một khung MVVM và tôi đã nhập dữ liệu vào các nhóm khác thông qua nhóm Disciples WPF, vì vậy tôi hơi thiên vị một chút. Nói rằng, ở đây đi:

Bộ công cụ MVVM của microsofts - điều này vẫn còn rất nhiều trong giai đoạn alpha. Khi nó được phát hành lần đầu, nó đã mất một chút man rợ từ các môn đệ vì những gì nó không làm. Nói rằng, MS đang tìm cách tăng cường khung này để nó được xem - nó chưa sẵn sàng.

Quỹ MVVM - ah phiên bản khung của Josh Smith. Josh là một trong những người điên của MVVM, và là một người ủng hộ và giáo viên mẫu mực rất lớn. Kết quả là, rất nhiều thứ bạn sẽ tìm thấy trong các khung khác có dấu vân tay của Josh trên đó. Khung này nhằm cung cấp các khái niệm cơ bản về MVVM và không giải quyết một số vấn đề bí truyền hơn. Ban đầu điều này chỉ dành cho WPF, nhưng những người như Laurent Bugnion và bản thân tôi đã thêm chức năng / dự án có nghĩa đây cũng sẽ là một khung tương thích Silverlight.

WAF - không có kinh nghiệm về nó, vì vậy tôi không thể nhận xét về nó Tôi sợ.

MVVM Light - Laurent Bugnion đảm nhận và chỉ cập nhật lên phiên bản 2. Đây là một khung rất tốt, nhưng một lần nữa, nó không có ý định bao quát mọi khía cạnh của các ứng dụng MVVM. Với nền tảng của Laurent, nó có hỗ trợ Silverlight và Blendability rất mạnh.

Cập nhật Laurent vừa thông báo cho tôi rằng phiên bản .NET 3.5 và .NET 4.0 tương thích với tính năng. Wau đi Laurent.

Cinch - Khung MVVM chỉ WPF tuyệt vời của Sacha Barber. Điều này bao gồm nhiều nền tảng hơn các khuôn khổ mà tôi đã nói ở trên. Đó là một khuôn khổ tuyệt vời và tận dụng các khái niệm được đề cập trong dự án Onyx xuất sắc của Bill Kempf . Onyx được dự định để bổ sung cho các khung công tác MVVM và thêm chức năng mà mọi người thường khó thực hiện trong MVVM / WPF. Một lần nữa, dự định ban đầu chỉ là WPF, Onyx đã tiến triển để bao gồm khả năng tương thích SL - công việc tôi đặc biệt tự hào đã được tham gia.

Lăng kính - Một lần nữa, tôi chưa bao giờ sử dụng nó, nhưng tôi đã nghe rất nhiều điều hay về nó.

Ocean - Karl Shifflett, Giám đốc chương trình trong nhóm Cider, gần đây đã phát hành một khuôn khổ MVVM WPF đầy đủ tính năng. Một lần nữa, đây là một khung tuyệt vời và có rất nhiều để giới thiệu nó.

Điểm mấu chốt là, tải xuống các khung khác nhau hãy xem chúng và tìm ra cái nào phù hợp nhất với cách bạn nghĩ và với yêu cầu của bạn. Nếu bạn nghĩ rằng bạn có thể muốn hỗ trợ Silverlight từ cùng một cơ sở mã thì các khung chỉ WPF nên được giảm giá.


4
Tôi sử dụng một cái mà chúng tôi đã viết, bởi vì chúng tôi có nhu cầu rất chuyên môn cho MVVM. Nó bị ảnh hưởng nặng nề bởi công việc mà Josh đã làm và tôi sẽ phát hành nó dưới dạng Nguồn mở trong tương lai gần (Tôi đang bận rộn trích xuất các bit độc quyền). Nó được gọi là Goldlight.
Pete OHanlon

Cùng với đó, khung lớp truy cập dữ liệu của bạn là gì? các bạn .. LINQ, LLBLGen, EF, nHibernate?
Jirapong

Nó phụ thuộc vào dự án và yêu cầu. Đôi khi chúng tôi sử dụng LINQ, đôi khi NHibernate, đôi khi Castle ActiveRecord và đôi khi eXpress Persistent Object.
Pete OHanlon

3
Xin chào Pete, chỉ muốn nhận xét rằng Bộ công cụ ánh sáng MVVM hoạt động giống như với WPF 3.5 và WPF 4 như đối với Silverlight 3 và Silverlight 4. Tôi cẩn thận giữ các tính năng đồng bộ hết mức có thể. Bạn nói đúng về khả năng hòa trộn, đây là một mối quan tâm lớn đối với tôi :) Chúc mừng, Laurent
LBugnion

1
Tôi đã thất vọng vì Bộ công cụ MVVM chưa được cập nhật để hoạt động với Visual Studio 2010. Có thể tôi muốn thêm nó vào quy trình ra quyết định. Hầu hết những người tôi biết sử dụng các mẫu MVVM trong năm 2010 đều sử dụng MVVM Light và một số người đã chuyển sang đó chỉ vì lý do này.
ScottCher

54

Tôi thấy bài viết này rất hữu ích http://www.japf.fr/2009/10/a-quick-tour-of-ex hiện-mvvm-frameworks/ Vì vậy, tôi mang nó đến đây cho người dùng sắp tới

Tôi cập nhật phần Cinch và thêm hỗ trợ silverlight cho các tính năng của nó

Tôi xin lỗi vì câu chuyện dài

Đặc điểm chung:

• Lớp ViewModelBase (để thực hiện giao diện INotifyPropertyChanged)

• RelayCommand thích lớp để liên kết lệnh UI với trình xử lý của ViewModel

• Kiểm tra đơn vị đi kèm với khung

Cinch

• Tác giả: Sacha Thợ cắt tóc

• Hỗ trợ Silverlight: không (phiên bản Cinch 2 hỗ trợ Silverlight)

• Tài liệu: xuất sắc, 6 bài báo được xuất bản trên CodeProject

• Lưu trữ: CodePlex

• Giấy phép: Code Project Open License

• Đặc trưng:

  1. hành vi gắn liền

  2. xác thực bằng IDataErrorInfo

  3. hỗ trợ cho IEditableObject

  4. tạo và đăng ký sự kiện yếu

  5. nhắn tin hòa giải sử dụng các sự kiện yếu

  6. Hỗ trợ IOC / DI (sử dụng Unity)

  7. dịch vụ: trình ghi sự kiện, hộp thông báo, mở hộp thoại lưu, cửa sổ bật lên

  8. trợ giúp luồng

  9. hỗ trợ cho các mục menu

  10. viewmodels có thể đóng

  11. Trình tạo mã MVVM

Bộ công cụ ánh sáng MVVM

• Tác giả: Laurent Bugnion

• Hỗ trợ Silverlight: có

• Tài liệu: nhiều bài viết có sẵn trên blog của Laurent + các nhà phát triển khác

• Lưu trữ: CodePlex

• Giấy phép: Giấy phép MIT

• Đặc trưng:

  1. Trình cài đặt MSI

  2. Mẫu dự án và vật phẩm VS

  3. Đoạn mã VS

  4. Hệ thống Messenger để liên lạc giữa các khung nhìn

  5. Xử lý các sự kiện như các lệnh

Người trợ giúp MVVM

• Tác giả: Mark Smith

• Hỗ trợ Silverlight: không

• Tài liệu: một số bài viết trên blog của Mark

• Hosting: trang web cá nhân

• Giấy phép: không được xác định

• Đặc trưng:

  1. hành vi gắn liền

  2. tạo viewmodel bằng cách sử dụng phần mở rộng đánh dấu

  3. xác nhận dựa trên thuộc tính

  4. IOC / DI sử dụng phương pháp ServiceProvider

  5. viewmodel có thể đóng

  6. con trỏ chờ (sử dụng WaitCthon mới () {// mã của bạn ở đây})

Quỹ MVVM

• Tác giả: Josh Smith

• Hỗ trợ Silverlight: không

• Tài liệu: bài viết về việc triển khai Messenger trên blog của Josh hoặc Marlon Grech

• Lưu trữ: CodePlex

• Giấy phép: MS-PL

• Đặc trưng:

  1. Hệ thống Messenger để liên lạc giữa các khung nhìn

  2. Giám sát sự kiện PropertyChanged

Caliburn

• Tác giả: Rob Eisenberg

• Hỗ trợ Silverlight: có

• Tài liệu: hoàn thành tài liệu trực tuyến có sẵn

• Lưu trữ: CodePlex http://www.codeplex.com/caliburn

• Giấy phép: Giấy phép MIT

• Đặc trưng:

  1. các lệnh được xây dựng trên đầu Hành động và do đó chia sẻ nhiều tính năng giống nhau, bao gồm nhiều tham số đầu vào, bộ lọc và thực thi không đồng bộ tự động

  2. những người thuyết trình xử lý vấn đề vòng đời UI như xử lý kích hoạt, hủy kích hoạt và ngữ nghĩa tắt cho các thành phần UI khác nhau

  3. Các ứng dụng Caliburn hoàn toàn có thể kiểm tra

  4. các tiện ích khác nhau như trình quản lý tác vụ nền

  5. hỗ trợ các mẫu UI khác nhau (không chỉ MVVM)

  6. container tiêm phụ thuộc

Mã não

• Tác giả: William e Kempf

• Hỗ trợ Silverlight: không

• Tài liệu: giới thiệu cơ bản có sẵn trên CodePlex

• Lưu trữ: CodePlex

• Giấy phép: không được chỉ định

• Đặc trưng:

  1. Mẫu ServiceLocator

  2. Tạo ViewModel bằng tiện ích mở rộng đánh dấu tùy chỉnh

  3. Các dịch vụ liên quan đến giao diện người dùng như IDisplayMessage

Canxi

• Tác giả: Daniel Vaughan

• Hỗ trợ Silverlight: không

• Tài liệu: 2 bài viết rất chi tiết về CodeProject (part1 và part2)

• Lưu trữ: CodePlex

• Giấy phép: sử dụng, sao chép, sửa đổi và / hoặc phân phối và giữ bản quyền!

• Đặc trưng:

  1. Trình quản lý mô-đun để bật hoặc tắt các mô-đun khi chạy

  2. dịch vụ nhắn tin để tương tác với người dùng từ máy khách hoặc máy chủ bằng cùng một API

  3. Dịch vụ lệnh để liên kết các ICommands WPF với các giao diện nội dung chỉ hoạt động khi chế độ xem hoạt động hoặc chế độ xem hoạt động thực hiện giao diện

  4. Bộ điều hợp vùng cho ToolBars và Menu

  5. Ghi nhật ký máy chủ-máy chủ đã sẵn sàng để hoạt động ngoài luồng

  6. Bao gồm các mô-đun, chẳng hạn như Trình duyệt web, Trình soạn thảo văn bản, Cửa sổ đầu ra và nhiều hơn nữa

  7. Giao diện được gắn thẻ với chỉ thị tệp bẩn (có thể tái sử dụng trên các mô-đun)

định tuyến

• Tác giả: Rishi

• Hỗ trợ Silverlight: có

• Tài liệu: nhiều bài viết có sẵn trên blog của tác giả (xem trang chủ của dự án CodePlex để biết các liên kết)

• Lưu trữ: CodePlex

• Giấy phép: MS-PL

• Đặc trưng:

  1. hỗ trợ các mô hình hành vi và kích hoạt Blend3

  2. khung định vị tài nguyên

  3. xem dịch vụ: OpenFileDialog, ShowMessage

  4. sử dụng các thuộc tính để ánh xạ View và ViewModel cùng nhau

Nito MVVM

• Tác giả: Shammah

• Hỗ trợ Silverlight: không

• Tài liệu: không

• Lưu trữ: CodePlex

• Giấy phép: không được chỉ định

• Đặc trưng:

  1. Các triển khai thân thiện MVVM khác nhau của giao diện ICommand

đại dương

• Tác giả: Karl Shifflet

• Hỗ trợ Silverlight: không

• Tài liệu: bài viết có sẵn trên blog của Karl

• Hosting: trang web cá nhân

• Giấy phép: không được chỉ định

• Đặc trưng:

  1. viết bằng VB.Net

  2. xác nhận dựa trên thuộc tính

  3. các lớp cơ sở của viewmodel: rơle, và có thể đóng lại

  4. Lớp truy cập dữ liệu máy chủ SQL

Khung MVVM cơ bản

• Tác giả: Lester Lobo

• Hỗ trợ Silverlight: không

• Tài liệu: ứng dụng mẫu có sẵn với thư viện

• Lưu trữ: CodePlex

• Giấy phép: MS-PL

• Đặc trưng:

  1. Lệnh ủy nhiệm \ Keybinding

  2. nhắn tin giữa VM

  3. xử lý các sự kiện như các lệnh với các hành vi đính kèm

  4. xử lý các hộp thoại (và nhiều hơn nữa) như các dịch vụ

  5. Đoạn mã VS

Ánh sáng tốt

• Tác giả: Peter O'Hanlon • Hỗ trợ Silverlight: có

• Tài liệu: ứng dụng mẫu có sẵn với thư viện

• Lưu trữ: CodePlex

• Giấy phép: MS-PL

• Đặc trưng:

  1. Không gian làm việc của ban quản lý (bộ tài liệu có thể đóng)

  2. hỗ trợ da

  3. nhắn tin giữa VM


Bài đăng tuyệt vời. Chỉ cần nghĩ rằng tôi thêm rằng Cinch phiên bản 2 không hỗ trợ Silverlight.
Kildareflare

44

Tôi cố gắng mô tả các Framework bị thiếu trong câu trả lời tuyệt vời của Pete:

MVVM Toolkit (Microsoft) là một thư viện rất nhẹ với các mẫu dự án Visual Studio nên hỗ trợ người mới bắt đầu với mẫu này. Nếu Microsoft nhận được phản hồi tốt cho Bộ công cụ của họ thì họ có thể triển khai đây dưới dạng mẫu dự án Visual Studio (có thể 2010) mới.

Prism (Microsoft p & p) là một khung cung cấp nhiều hơn sự hỗ trợ cho mẫu MVVM. Mục tiêu chính của dự án này là giúp bạn xây dựngcác ứng dụng WPF và / hoặc Silverlight mô-đun . Khi bạn chỉ cần triển khai mẫu MVVM hoặc bạn là người mới bắt đầu sử dụng .NET / WPF, tôi sẽ không đề xuất dự án này. Xem thêm: Liên kết .

Khung ứng dụng WPF (WAF) là một khung nhẹ giúp bạn tạo các ứng dụng WPF bằng MVVM. Nó chỉ dành cho WPF và vì vậy nó không hỗ trợ Silverlight. Nó đi một cách khác so với hầu hết các khung công tác MVVM khác với việc giới thiệu Bộ điều khiển . Họ chịu trách nhiệm về quy trình làm việc của ứng dụng và họ làm trung gian giữa nhiều ViewModels khác nhau.


19

Meh. Mvvm không thực sự yêu cầu toàn bộ khung để hỗ trợ IMO. Nếu bạn hiểu khái niệm này, thật đơn giản để bắt đầu với một lớp cơ sở VM sạch sẽ thực hiện INotify và chỉ cần đi từ đó.


4
Có một lý do tại sao rất nhiều nhà phát triển phát triển thư viện mvvm. Nếu những gì bạn nói là đúng, thì tại sao những nhà phát triển này lại lãng phí thời gian của họ? Tại sao những người dùng này sẽ tiếp tục sử dụng khung mvvm yêu thích của họ? Đúng, "Mvvm không thực sự yêu cầu toàn bộ khung để hỗ trợ IMO". Nhưng nó không thực tế để làm mà không có khung MVVM.
Nizam Yahya Syaiful

3
-1 IMO viết lớp RelayCommand của riêng bạn cho ICommands, lớp Messenger để liên lạc giữa VM và bộ chứa IoC của riêng bạn để chỉ các công cụ cơ bản nhất cần có cho ứng dụng WPF hoạt động tốt, là một PITA chính. Câu trả lời của bạn chỉ có giá trị cho các chương trình đơn giản nhất.
Heliac


10

Trộn của riêng bạn!

Tôi đã sử dụng EventAggregator từ PRISM, với ViewModelBase từ nền tảng MVVM, v.v. Tôi cũng đã điều chỉnh RelayCommand (DelegateCommand được gọi ở một số nơi) để chấp nhận dữ liệu khác, v.v.

Tôi sẽ không đề xuất chỉ một khung mỗi se.


19
Tôi không đồng ý, vấn đề với cách tiếp cận này sẽ tự tiết lộ khi bạn có người mới tham gia - chi phí tham gia vào dự án sẽ cao hơn nhiều vì các tài liệu nội bộ thường không phải là ưu tiên.
Florian Doyon

1
Tôi có thể thấy quan điểm về tài liệu. Nhưng có thể không cần phải phát triển tài liệu nội bộ. Các trang web bên ngoài với tài liệu có thể được nhúng vào chính mã
Vasudevan Kannan

8

Đặt cược của tôi sẽ là Caliburn và MVVMlight, có vẻ như không có nhiều khung mvvm này hỗ trợ Silverlight. Tôi có thể thấy trước rằng sẽ có nhiều khung công tác MVVM để lựa chọn hơn các khung công tác IoC, bởi vì khó thiết lập ranh giới tính năng cho khung công tác mvvm. Tôi đoán cách tốt nhất để tìm ra cái nào phù hợp hơn với dự án của bạn sẽ là liệt kê / so sánh các tính năng của chúng.

Ngoài ra hãy kiểm tra Mix10. Tôi học được rất nhiều từ bài nói chuyện: xây dựng khung mvvm của bạn.


4
Tôi thấy rằng nói chuyện khá hữu ích. Đây là một liên kết trực tiếp: live.visitmix.com/MIX10/Simes/EX15
anshul


4

Tôi đang sử dụng Prism và thích nó. Một trong những điều quan trọng đối với tôi là sẽ có những người khác ở ngoài đó có thể giúp tôi nếu cần và làm gương tốt. Khi bạn có được những điều cơ bản đang chạy, có rất nhiều tiện ích mở rộng bạn sẽ cần cho ứng dụng của mình và nó sẽ dễ dàng hơn rất nhiều khi bạn làm việc với cùng một khung như những người khác.


2

Nói chung, tôi có 90% thông qua ứng dụng của mình và tất cả những gì tôi đã sử dụng MVVM Toolkit là chức năng xuất xưởng xây dựng lệnh cho tôi được cung cấp một hàm ủy nhiệm để khởi chạy trong Execute. Tôi nghĩ rằng tôi có thể chuyển sang bất kỳ khung nào khác hoặc không có khung nào trong vài giờ.


2

Một cái khác để xem xét là MEFedMVVM . Tôi đã sử dụng nó cho một vài dự án và nó nhẹ, không xâm phạm và hỗ trợ Silverlight và WPF. Nó cũng có thể hỗ trợ dữ liệu thời gian thiết kế trong Blend, cho những người sử dụng sản phẩm đó.


1

Nếu bạn đang tìm kiếm Khả năng mở rộng (khả năng viết bổ trợ) trên khung ứng dụng WPF / MVVM, thì bạn có thể quan tâm đến tuyên bố từ chối trách nhiệm của SoapBox Core : Tôi đã viết nó . Nó có nguồn mở, vì vậy ngay cả khi bạn không sử dụng nó, có thể có một số ý tưởng tốt trong đó cho bạn. Nó sử dụng MEF cho cả Khả năng mở rộng và IoC.


1

Ngoài ra còn có nRoute

Một khung ứng dụng thực sự tốt cho WPF / Silverlight hỗ trợ MVVM

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.