砂漠の旅人(たびと)

UNIX / MS-DOS 時代から電脳砂漠を旅しています

.NET 6 の WPF で MVVM を実装するには、どのフレームワークがいいのか?

こんにちは、たびとです。

TubeEater を作り終えたので、開発時に課題とした「WPF の MVVM(Model - ViewModel - Model)」について、 真面目に取り組もうと思いました。 これは、新たなアプリ開発で実装しようと考えています。

ASP.NET Core の場合、MVC(Model - View - Controller) の実装がサポートされていて、 何度かプロジェクトで使ったことがありますが、MVVM とは何が違うのでしょうか。

この辺りを整理して、WPF で MVVM を実装するには、 どんなフレームワークを使えば良いのかを調べてみたいと思います。

この記事の対象者

  • WPF で MVVM を実装してみたい方
  • MVC と 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 の二択に絞り込めました。

  • Livet : 国産だが、新機能は積極的に追加されない模様。
  • Prism : 元々 Microsoft からリリースされた最古参の MVVM フレームワーク

更に調べていくと、Prism は MahApps と MaterialDesign Xaml Toolkit にも対応することがわかりました。 また、Livet は機能を分割して、Prism にも導入できるようです。

これらを総合的に判断すると、Prism を選択するのがよさそうです。 NuGet では .NET 5 と表示されますが、.NET 6でも大丈夫でしょう。

次点で、Caliburn.Micro と Catel が候補になります。 どちらも MahApps が使えるようですが、 NuGet の参照数と情報量から今回は Prism を選択しました。

Prism を触ってみる

早速、公式サイトのサンプルをダウンロードしてみます。

github.com

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 を使えるようになるまで、 頑張ってみようかと思います。

最後に参考サイトを掲載しておきます。 では、皆さん、よい旅を。

参考サイト