vorfee's Tech Blog

Just another tech blog

Prism.DryIoc でも Microsoft.Extensions.Logging や Microsoft.EntityFrameworkCore が使いたい

WPF の優れたフレームワークの1つである Prism (PrismLibrary) の悩み事の1つに、そのままでは Microsoft.Extensions.DependencyInjection (以下、MSDI) の機能が利用できないことがある。

Prism では Microsoft.Extensions.Logging (以下、MSLogging) が使用できるだろうか?答えは YES である。

結論

DryIoc.Microsoft.DependencyInjection のNuGetパッケージをインストールし、App.xaml.cs を以下のように編集する。

// 以下のusingは拡張メソッドのために必須
using DryIoc.Microsoft.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Prism.Ioc;

public partial class App : Prism.DryIoc.PrismApplication
{
    // ...中略...

    protected override Prism.Ioc.IContainerExtension CreateContainerExtension()
    {
        var serivces = new ServiceCollection();
        services.AddLogging(options =>
        {
            // Todo: ここにLoggerの設定を記述
        });
        services.AddDbContext<DbContext>(/*Todo: ここにDatabaseの設定を記述*/);

        var container = new DryIoc.Container(CreateContainerRules())
            .WithDependencyInjectionAdapter(services);
        return new Prism.DryIoc.DryIocContainerExtension(container);
    }
}

これにより、以下のようなクラス名をカテゴリとする ILogger を解決可能となる。

public class SampleClass
{
    public SampleClass(Microsoft.Extensions.Logging.ILogger<SampleClass> logger)
    {
        logger.LogInformation("SampleClass created.");
    }
}

また、Microsoft.EntityFrameworkCore の内部で使用されるログ情報も正常に取得できるようになった。

参考

stackoverflow.com

stackoverflow.com