MVC、MVVM、Razor Pages、Blazorについて話してみた

※この記事は、普段WPFを使っている「ががん」とChatGPTとの質疑応答をもとに、ChatGPTこと「ドイ」が構成・執筆しています。

先日、ががんが個人用ダッシュボードを作り始めた。

最初はASP.NET Core Razor Pagesで作る予定だったが、途中で技術構成について話しているうちに、最終的にはBlazorを使ってみることになった。

その途中で、こんな疑問が出てきた。

「そもそもMVCって、MVVMみたいなアーキテクチャの話じゃないの?」

普段WPFを触っているががんにとって、MVVMは馴染みがある。

一方で、MVC、Razor Pages、Blazorの違いについては、なんとなく聞いたことがある程度だったらしい。

ということで今回は、そのときのやり取りをもとに、それぞれの違いと、なぜ今回Blazorを使うことになったのかを整理してみる。

MVCとMVVMは同じ種類の話?

まず最初に出てきたのが、

「MVCって、MVVMみたいなアーキテクチャの話だと思ってたけど、認識合ってる?」

という疑問。

これは、おおむねその認識で合っている。

MVCは、

  • Model
  • View
  • Controller

MVVMは、

  • Model
  • View
  • ViewModel

に役割を分ける考え方だ。

普段使っているWPF + MVVMでは、ViewとViewModelをデータバインディングでつなぐ。

ViewModelの状態が変われば画面に反映され、画面からの入力もViewModelに渡すことができる。

一方のMVCでは、Controllerがユーザーからの要求を受け取り、必要な処理を行い、その結果をViewに渡す。

この話をしていると、ががんからこんな感想が出てきた。

「MVCが古典的なWindows Formsっぽく感じるな」

MVCはWindows Formsっぽい?

確かに、Controllerがユーザーからの要求を受けて処理するところだけを見ると、Windows Formsのイベントハンドラに少し似て見える。

ただ、役割の分け方はかなり違う。

典型的なWindows Formsでは、Formが画面そのものであり、その中にイベントハンドラも書ける。

ボタンを押したら処理をして、そのまま画面上のコントロールを書き換えることもできる。

つまり、画面と処理が同じFormの中に存在できる。

一方、MVCでは画面を担当するViewと、処理を取り仕切るControllerが分かれている。

Controllerは処理結果をViewに渡すが、Windows Formsのように画面上のコントロールを直接書き換えるわけではない。

似て見えたのは、どちらも「ユーザーからの操作や要求を受けて処理する」という部分だったようだ。

そして、ここで新しい疑問が出てきた。

「Webだと、Viewにあたるのがどこになるの?」

WebのViewは「画面そのもの」ではない

Windows FormsやWPFでは、画面そのものがアプリケーションの中に存在している。

そのため、画面上のコントロールや、画面が持っている状態を扱う感覚がある。

一方、昔ながらのWeb MVCは少し違う。

ざっくり書くと、

  1. ブラウザからリクエストが来る
  2. Controllerが処理する
  3. Viewを使ってHTMLを生成する
  4. 生成したHTMLをブラウザに返す

という流れになる。

ASP.NET Core MVCであれば、.cshtmlファイルがViewにあたる。

ここでいうViewは、Windows FormsやWPFのように「今そこに表示されている画面そのもの」というより、ブラウザに返すHTMLを作るためのものと考えると分かりやすい。

HTMLをブラウザに返したあと、Controllerがその画面を直接操作するわけではない。

普段デスクトップアプリを触っていると、この辺りの感覚が少し違う。

この違いが分かると、なぜBlazorがWPF経験者に少し馴染みやすく感じるのかも見えてくる。

その前に、今回最初に使おうとしていたRazor Pagesについても整理しておく。

Razor Pagesは何なのか

今回のダッシュボードは、最初はRazor Pagesで作る予定だった。

Razor Pagesは、ページ単位でWebアプリを作りやすくした仕組みだ。

例えば、

  • Index.cshtml
  • Index.cshtml.cs

というファイルをセットで扱う。

Index.cshtmlが表示を担当し、Index.cshtml.csのPageModelが、そのページに必要な処理やデータを担当する。

MVCではControllerとViewが別々に存在するが、Razor Pagesではページを中心に必要なものがまとまっている。

そのため、

「ページを表示する」

「入力する」

「送信する」

といった、ページ単位で完結しやすいWebアプリでは分かりやすい。

ただし、基本的にはサーバーで処理をしてHTMLを返すWebアプリであることに変わりはない。

もちろん、MVCやRazor Pagesでも画面の一部分だけを更新することはできる。

ただ、画面をどんどん動的にしていこうとすると、JavaScriptなどを組み合わせる場面も増えてくる。

Blazorは「画面を作る感覚」が少し違う

Blazorでは、画面をコンポーネントとして作ることができる。

コンポーネントは状態を持つことができ、その状態が変わると画面も更新される。

例えば今回のようなダッシュボードなら、

  • Twitchの情報を表示するコンポーネント
  • 株価を表示するコンポーネント
  • TODOを表示するコンポーネント

といった形で、それぞれを分けて作ることができる。

それぞれが別々の状態を持ち、必要に応じて表示を更新していく。

この辺りは、WPF + MVVMで「状態が変わるとUIにも反映される」という世界に慣れているががんには、比較的イメージしやすかったようだ。

ただし、BlazorがMVVMというわけではない。

MVCやMVVMは、アプリケーションの役割をどう分けるかという設計上の考え方。

Blazorは、C#を使ってWeb UIを作るためのフレームワーク。

Razor Pagesも含め、厳密にはすべてが同じ種類のものというわけではない。

今回は「ASP.NET CoreでWebアプリを作るなら、どういう作り方があるのか」という話の中で比較していたため、並んで登場していたということになる。

BlazorとInteractive Serverも別の話

今回作ったダッシュボードは、

.NET 10 Blazor Web App + Interactive Server

という構成になっている。

ここでも最初は少し混乱があった。

Blazorは、C#でWeb UIを作るための技術。

Interactive Serverは、そのBlazorのUIをどこで実行し、ブラウザとどうやり取りするかを決める方式の一つ。

Interactive Serverでは、C#の処理は主にサーバー側で動く。

ブラウザとサーバーは接続を維持しながらやり取りし、状態が変わると必要な部分の画面が更新される。

この仕組みを聞いたががんからは、

「これ、多人数向けのWebアプリには向かなそうな気がする」

という疑問も出てきた。

実際、Interactive Serverではユーザーごとの接続や状態をサーバー側で扱うため、利用者が増えれば同時接続数やサーバー負荷などを考える必要がある。

ただし、これはBlazorそのものの話ではない。

Blazorには、ブラウザ側で処理を動かすInteractive WebAssemblyなど、別の実行方式もある。

今回作るのは、基本的には自分で使うための個人用ダッシュボード。

そのため、まずはInteractive Serverで始めても特に問題はなさそうだ。

なぜ今回はBlazorなのか

ここまで話してきたが、BlazorがMVCやRazor Pagesより優れている、という話ではない。

単純なページを作るならRazor Pagesの方が分かりやすいこともある。

MVCが向いているアプリケーションもある。

今回のポイントは、今のががんとの相性だった。

普段はWPFとC#を使っている。

Webアプリはほとんど触らない。

Web開発そのものを体系的に勉強することが目的でもない。

そして作りたいのは、色々な情報を一つの画面にまとめる個人用ダッシュボード。

今後、表示する情報が増えていけば、それぞれをコンポーネントとして追加していくことができる。

それぞれの情報が変化したときも、コンポーネント単位で状態を扱える。

MVCやRazor Pagesでも動的な画面を作ることはできるが、そのためにJavaScriptなど、別の技術を扱う場面も増えてくる。

一方、Blazorなら使い慣れたC#を中心に、そのまま動的なWeb UIを作り始めることができる。

もちろん、Blazorを使えばJavaScriptが一切必要なくなるわけではない。

ただ、少なくともJavaScriptを覚えないとスタートできないわけではない。

つまり今回の結論は、

「Blazorが一番優れている」

ではなく、

「今のががんが持っている知識と、今作りたいものにはBlazorがかなり都合がいい」

ということだった。

そんなわけで、ががんの個人用ダッシュボードはBlazorで作っていくことになった。

現時点では、まだ「Hello, world!」しか表示されていない。

果たして、ここからちゃんとダッシュボードになるのだろうか。

補足

この記事は、普段WPFを使用している「ががん」とChatGPTとの質疑応答をもとに、ChatGPTこと「ドイ」が構成・執筆しました。

内容についてもChatGPTが整理しているため、今後実際にBlazorを触っていく中で認識が変わったり、補足したいことが出てきたりするかもしれません。

そのときは、また続きを書こうと思います。

コメント

タイトルとURLをコピーしました