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#:
- public partial class App : Application
- {
- public IHost Host { get; }
- public App()
- {
- Host = Host.CreateDefaultBuilder()
- .ConfigureServices((context, services) =>
- {
- services.AddSingleton<MainWindow>();
- services.AddSingleton<MainViewModel>();
- })
- .Build();
- }
- protected override async void OnStartup(StartupEventArgs e)
- {
- await Host.StartAsync();
- var window = Host.Services.GetRequiredService<MainWindow>();
- window.Show();
- base.OnStartup(e);
- }
- }
ミナト「おおっ……! Hostをアプリの最初に作って、Windowの解決にも使える!」
ハルカ「そう。しかもここでViewModelもDI登録しておけば、ViewとViewModelのバインディングもスマートにできるんだ」
3. MVVMのDIとの相性
ミナト「MVVMって、ViewModelのテストもしやすくなるし、DIが合いますよね」
ハルカ「うん、ViewModelの構築をHost経由にすると、依存関係が一元管理できて本当にラクになる」
ミナト「じゃあ、ViewModelの中にサービスを注入するのもHostで完結?」
ハルカ「もちろん」
ViewModelへの依存注入の例
C#:
- public class MainViewModel
- {
- private readonly ILogger<MainViewModel> _logger;
- public MainViewModel(ILogger<MainViewModel> logger)
- {
- _logger = logger;
- _logger.LogInformation("MainViewModel initialized.");
- }
- }
ミナト「お~! ViewModelに
ILogger
注入してるの、めっちゃいいですね」
ハルカ「これでログ出力も設定も、Host流の統一ルールで扱えるようになるってわけ」
4. GUIアプリでHostを使うメリット
メリット | 説明 |
---|---|
DIが使える | ViewModel・サービスの注入が簡単に |
設定・ログも一元管理 | appsettings.json の読み込みや ILogger の導入が容易 |
テストしやすい構成 | モックやテストHostを使った単体テストに強い |
構成が近代的 | Webアプリやバッチとアーキテクチャが統一できる |
ミナト「なんか……今までのWPFのコードが職人芸に見えてきました……」
ハルカ「そこにHostを入れると、モダンな分業できるコードになるのよ」
5. まとめ: GUIアプリ × Host、むしろ相性いい!
ミナト「GUIアプリって特殊なものかと思ってましたけど、Hostを導入するとアプリとしての設計が整うんですね」
ハルカ「そう! UI層はUI層、ロジックはロジックで、Hostが全体をつなぐ役になってくれる」
ミナト「やってみたくなってきました!」
ハルカ「じゃあ次は、
IHostedService
でバックグラウンド監視を入れてみるとかどう?」
0 件のコメント:
コメントを投稿