この記事は公開から1年以上経過しています。
.NET Core3以降で追加された汎用ホスト(IHost)やDIを、.NET Core3以降のWPFアプリケーションで利用する方法。
対応
-
App.xaml.cs
のOnStartup()
をオーバーライドして汎用ホストでMainWindowを起動するためのコードを追加。using System; using System.Windows; using Microsoft.Extensions.DependencyInjection; namespace MyApp { public partial class App : Application { private IServiceProvider? _serviceProvider; protected override void OnStartup(StartupEventArgs e) { var sc = new ServiceCollection(); sc .AddSingleton<MainWindow>() .AddClient(); _serviceProvider = sc.BuildServiceProvider(); var mainWindow = _serviceProvider.GetRequiredService<MainWindow>(); mainWindow.Show(); base.OnStartup(e); } } }
-
MainWindowが多重起動しないように
MainWindow.xaml
からStartupUri="MainWindow.xaml"
を削除。<Application x:Class="MainApp.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:MainApp" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:MyApp" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"> </Application>
-
後は通常通り
MainWindow.xaml.cs
のコンストラクタで必要に応じたサービスを取得。public partial class MainWindow : Window { public MainWindow(/* ISomeService someService */) { InitializeComponent(); } }
※ラインタイムにサービスを解決する場合などは、
IServiceProvider
を使用。
以上です。