MVVMでもHostって使えるんですか先輩? ~GUIアプリと汎用ホストを組み合わせる発想~

2025年4月26日土曜日

AIに聞いてみた C# WPF

ChatGPTにHostについて聞いてみました(続き)。

タイトル、文章、イラスト: ChatGPT

登場人物

  • ミナト(左): MVVMを初めて触るGUIアプリ開発プロジェクトに参加中。Hostの便利さを知っている。
  • ハルカ(右): 社内のWPFおよび.NET全般に詳しい先輩。構成の気持ちいい設計が大好き。

1. MVVMって、Hostと無縁?

ミナト「先輩、最近WPFのプロジェクトに入ったんですけど……Host、使ってないんですよ」

ハルカ「あ~、あるある。GUI系のプロジェクトって、昔ながらの構成が多いからね」

ミナト「でも、Host使えば設定・ログ・DIぜんぶまとめられて便利じゃないですか? GUIでも使えたら……って思って」

ハルカ「ナイス視点! それ、実は全然アリなんだよ」

2. GUIアプリでもHostは使える!

ハルカ「HostってWebアプリのものって思われがちだけど、GUIアプリでも全然使えるのよ。むしろ使った方が設計がスッキリする」

ミナト「でもGUIアプリってApp.xaml.csがスタート地点ですよね? そこにHostって……」

ハルカ「そのApp.xaml.csのOnStartupで、Hostを作ってしまえばOK!」

最小構成のサンプルコード(WPF)

C#:

  1. public partial class App : Application
  2. {
  3. public IHost Host { get; }
  4.  
  5. public App()
  6. {
  7. Host = Host.CreateDefaultBuilder()
  8. .ConfigureServices((context, services) =>
  9. {
  10. services.AddSingleton<MainWindow>();
  11. services.AddSingleton<MainViewModel>();
  12. })
  13. .Build();
  14. }
  15.  
  16. protected override async void OnStartup(StartupEventArgs e)
  17. {
  18. await Host.StartAsync();
  19. var window = Host.Services.GetRequiredService<MainWindow>();
  20. window.Show();
  21. base.OnStartup(e);
  22. }
  23. }

ミナト「おおっ……! Hostをアプリの最初に作って、Windowの解決にも使える!」

ハルカ「そう。しかもここでViewModelもDI登録しておけば、ViewとViewModelのバインディングもスマートにできるんだ」

3. MVVMのDIとの相性

ミナト「MVVMって、ViewModelのテストもしやすくなるし、DIが合いますよね」

ハルカ「うん、ViewModelの構築をHost経由にすると、依存関係が一元管理できて本当にラクになる」

ミナト「じゃあ、ViewModelの中にサービスを注入するのもHostで完結?」

ハルカ「もちろん」

ViewModelへの依存注入の例

C#:

  1. public class MainViewModel
  2. {
  3. private readonly ILogger<MainViewModel> _logger;
  4.  
  5. public MainViewModel(ILogger<MainViewModel> logger)
  6. {
  7. _logger = logger;
  8. _logger.LogInformation("MainViewModel initialized.");
  9. }
  10. }

ミナト「お~! ViewModelにILogger注入してるの、めっちゃいいですね」

ハルカ「これでログ出力も設定も、Host流の統一ルールで扱えるようになるってわけ」

4. GUIアプリでHostを使うメリット

メリット 説明
DIが使える ViewModel・サービスの注入が簡単に
設定・ログも一元管理 appsettings.json の読み込みや ILogger の導入が容易
テストしやすい構成 モックやテストHostを使った単体テストに強い
構成が近代的 Webアプリやバッチとアーキテクチャが統一できる

ミナト「なんか……今までのWPFのコードが職人芸に見えてきました……」

ハルカ「そこにHostを入れると、モダンな分業できるコードになるのよ」

5. まとめ: GUIアプリ × Host、むしろ相性いい!

ミナト「GUIアプリって特殊なものかと思ってましたけど、Hostを導入するとアプリとしての設計が整うんですね」

ハルカ「そう! UI層はUI層、ロジックはロジックで、Hostが全体をつなぐ役になってくれる」

ミナト「やってみたくなってきました!」

ハルカ「じゃあ次は、IHostedServiceでバックグラウンド監視を入れてみるとかどう?」