こんにちは、たびとです。
TubeEater を作り終えたので、開発時に課題とした「WPF の MVVM(Model - ViewModel - Model)」について、 真面目に取り組もうと思いました。 これは、新たなアプリ開発で実装しようと考えています。
ASP.NET Core の場合、MVC(Model - View - Controller) の実装がサポートされていて、 何度かプロジェクトで使ったことがありますが、MVVM とは何が違うのでしょうか。
この辺りを整理して、WPF で MVVM を実装するには、 どんなフレームワークを使えば良いのかを調べてみたいと思います。
この記事の対象者
MVC と MVVM
どちらも、Model と View は同じ、違いは ViewModel か Controller だけです。 Wikipedia によると、MVC パターンの派生であると書いてあるので、似ていて当然のようです。
MVC
ASP.NET Core MVC は、以下のような構造なので、何度か作ってみると感覚的に理解できると思います。
- Model : ビジネスロジック(以下の2つ以外、だいたいDB周りかな)
- View : Views フォルダ配下の cshtml ファイル(HTMLの部分)
- Controller : Controllers フォルダ配下に格納された Microsoft.AspNetCore.Mvc.Controller クラスを継承したクラス
改めて、インターネットで調べてみると、M/V/C の役割がはっきりしていて、 Controller が肥大化するのがデメリットなど、何となく理解できる内容が多い印象です。
ASP.NET Core の場合、MVC よりも、色々なフレームワークを Program.cs に組み込むことに苦労すると思います。 従来は、Program.cs と Startup.cs でしたが、.NET 6 からは Program.cs に統合されました。
MVVM
MVVM は、まだ理解が追い付かないため、Wikipedia から内容を借用しています。 Model(M) と View(V) に関しては、MVC と同じと考えてよさそうです。
- Model : View と ViewModel 以外。
- View : ユーザからの入出力を担当する。MVVM における View は状態を持たず、MVC における Controller を包含する。
- ViewModel : View を描画するための状態の保持と、View から受け取った入力を適切な形に変換して Model に伝達する。
他のサイトを見ると、 データバインディング が重要で、「格納したデータはデータバインディングによって、 ViewModel で変更されたデータは即座に View に反映される」とか書いてありました。 と言うことは、Xaml の Binding によって、データを Xaml 外に保持するということでしょうか。
何となく理解できたような感じですが、しっくりこない感じです。 これ以上は、実際にやってみないと理解できないのでしょう。
WPF で MVVM を実装する
自前で MVVM は大変なので、フレームワークを探してみることにしました。 最低条件は、.NET 6 で動作すること、よくわからないので情報が多いことです。
Livet と Prism
色々と調べていくと、 Livet と Prism の二択に絞り込めました。
更に調べていくと、Prism は MahApps と MaterialDesign Xaml Toolkit にも対応することがわかりました。 また、Livet は機能を分割して、Prism にも導入できるようです。
これらを総合的に判断すると、Prism を選択するのがよさそうです。 NuGet では .NET 5 と表示されますが、.NET 6でも大丈夫でしょう。
次点で、Caliburn.Micro と Catel が候補になります。 どちらも MahApps が使えるようですが、 NuGet の参照数と情報量から今回は Prism を選択しました。
Prism を触ってみる
早速、公式サイトのサンプルをダウンロードしてみます。
NuGet パッケージマネージャーで見てみると、以下の 3つが含まれていました。
Unity は、DI フレームワークで、Visual Studio 2019 の拡張機能で Prism Template Pack を入れた場合、 DryIoC との二択から選択できるようです。 DI は、あまり意識することはないそうなので、どちらを入れるかは好みのようです。 早く Visual Studio 2022 版を作ってくれることを期待しましょう。
サンプルは30ぐらいあるのだけど、半分ぐらい見て 「これは一筋縄ではいかないな」と感じました。 とにかく複雑で、実装方法も何通りもあったりするため、 仕組みに慣れるまでの学習コストが高いと思います。
まとめ
.NET 6 の WPF で MVVM を実装するには、現状は Prism がよさそうです。 しかし、少し触ってみた感じですが、かなり複雑で覚えるまでが大変そうです。
昔、CIFS/HTTP/FTP のプロトコルを Interface で共通化し、 Java の Spring を .NET に移植した Spring.NET と WCF を 組み合わせたアプリ基盤を開発途中で引き続き、 大変な目にあった記憶が蘇ってきました。
とりあえず、Prism を使えるようになるまで、 頑張ってみようかと思います。
最後に参考サイトを掲載しておきます。 では、皆さん、よい旅を。
参考サイト
- Model View ViewModel - Wikipedia
- ソフトウェアアーキテクチャー...?MVCやMVVMってなに!?
- MVVM フレームワーク充のススメ step: 2 | :: halation ghost ::
- GitHub - runceel/Livet: WPF MVVM Infrastructure.
- GitHub - PrismLibrary/Prism: Prism is a framework for building loosely coupled, maintainable, and testable XAML applications in WPF, Xamarin Forms, and Uno / Win UI Applications..
- Introduction to Prism | Prism
- GitHub - PrismLibrary/Prism-Samples-Wpf: Samples that demonstrate how to use various Prism features with WPF
- Caliburn.Micro · 'Xaml made easy' · Caliburn.Micro
- Catel docs