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で完結?」
C#:ハルカ「もちろん」
ViewModelへの依存注入の例
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 件のコメント:
コメントを投稿