.NET Core3以降のWPFアプリケーションで汎用ホストやDIを使う方法

この記事は公開から1年以上経過しています。

.NET Core3以降で追加された汎用ホスト(IHost)やDIを、.NET Core3以降のWPFアプリケーションで利用する方法。


対応

  1. App.xaml.csOnStartup()をオーバーライドして汎用ホストで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);
            }
        }
    }
  2. 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>
  3. 後は通常通りMainWindow.xaml.csのコンストラクタで必要に応じたサービスを取得。

    public partial class MainWindow : Window
    {
        public MainWindow(/* ISomeService someService */)
        {
            InitializeComponent();
        }
    }

    ※ラインタイムにサービスを解決する場合などは、IServiceProviderを使用。


以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする