🦁

WPFをGeneric Host上で実行するためのライブラリ「Wpf.Extensions.Hosting」をリリースしました

2022/01/22に公開

現在新しくリリースされる.NET向けの素晴らしいライブラリの多くは、Generic Hostを前提として提供されるようになってきていると思います。そしてWPFアプリケーションからそれらを利用するためには、WPFアプリケーションもGeneric Host上で動作させる必要があります。

WPFアプリケーションをGeneric Hostで動かすことは、基本的な動作であればそれほど難しいわけではありません。しかしGeneric Hostのすべてを享受するためには、それなりに工夫が必要です。

そこでWpf.Extensions.Hostingをリリースしました。

Wpf.Extensions.Hostingは、WPFアプリケーションをGeneric Host上で動作させるためのライブラリです。

Wpf.Extensions.Hostingでは、.NET6ライクにGeneric Host上のWPFアプリケーションをシンプルかつ直感的に記述できます。

// Create a builder by specifying the application and main window.
var builder = WpfApplication<App, MainWindow>.CreateBuilder(args);

// Configure dependency injection.
// Injecting MainWindowViewModel into MainWindow.
builder.Services.AddTransient<MainWindowViewModel>();

// Configure the settings.
// Injecting IOptions<MySettings> from appsetting.json.
builder.Services.Configure<MySettings>(builder.Configuration.GetSection("MySettings"));

// Configure logging.
// Using the diagnostic logging library Serilog.
builder.Host.UseSerilog((hostingContext, services, loggerConfiguration) => loggerConfiguration
    .ReadFrom.Configuration(hostingContext.Configuration)
    .Enrich.FromLogContext()
    .WriteTo.Debug()
    .WriteTo.File(
        @"Logs\log.txt", 
        rollingInterval: RollingInterval.Day));
    
var app = builder.Build();

app.RunAsync();

ぜひ利用してみてください。

Getting Started

WPFプロジェクトを作成し、NuGetからパッケージを追加します。

NuGet :Wpf.Extensions.Hosting

Install-Package Wpf.Extensions.Hosting

アプリケーションのエントリポイント(Mainメソッド)の自動生成を停止します。.csprojファイルを開き、EnableDefaultApplicationDefinitionをfalseに設定します。

<Project Sdk="Microsoft.NET.Sdk">

	<PropertyGroup>
		<OutputType>WinExe</OutputType>
		<TargetFramework>net6.0-windows</TargetFramework>
		<Nullable>enable</Nullable>
		<UseWPF>true</UseWPF>
		<EnableDefaultApplicationDefinition>false</EnableDefaultApplicationDefinition>
	</PropertyGroup>

	<ItemGroup>
		<PackageReference Include="Wpf.Extensions.Hosting" Version="0.0.3" />
	</ItemGroup>

</Project>

App.xamlからStartupUriの記述を削除します。

<Application x:Class="GettingStarted.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:GettingStarted">
    <Application.Resources>
         
    </Application.Resources>
</Application>

App.xaml.csにコンストラクターを追加します。

    public partial class App : Application
    {
        public App()
        {
            InitializeComponent();
        }
    }

Program.csファイルを作成し、Generic Host上でWPFアプリケーションを実行します。

using GettingStarted;

// Create a builder by specifying the application and main window.
var builder = WpfApplication<App, MainWindow>.CreateBuilder(args);

// Build and run the application.
var app = builder.Build();
app.RunAsync();

Dependency Injectionを使用する

MainWindowにViewModelを注入する例を示します。まずはMainWindowViewModelを作成します。

namespace GettingStarted;

public class MainWindowViewModel
{
    public string Message => "Hello, Generic Host!";
}

MainWindowのコンストラクターの引数にViewModelを受け取り、DataContextに設定するように修正します。

public MainWindow(MainWindowViewModel mainWindowViewModel)
{
    InitializeComponent();
    DataContext = mainWindowViewModel;
}

Program.csでViewModelをDIコンテナに登録します。

// Register the ViewModel to be injected into MainWindow to the DI container.
builder.Services.AddTransient<MainWindowViewModel>();

このように、Generic Hostのすべての機能を利用することができます。

Discussion