おーみんブログ

C#, ASP.NET Core, Unityが大好きです。

【ASP.NET Core】DIシステムへの型登録を動的に変更してみる。

はじめに

ASP.NET CoreではDIシステムに型を登録することができます(一般的にはConfigureServicesメソッド内にて)。 今回の記事ではDIシステムへの型登録を動的に変更する方法を備忘録として残しておきます。

サンプルコード

下記のサンプルコードではappsettings.jsonの動物項目にて"Dog"が設定されていたら犬クラスが、それ以外の場合は猫クラスが設定されるようにしています。

public void ConfigureServices(IServiceCollection services)
{
    // appsettings.jsonから動物を選択
    var animalValue = Configuration.GetSection(NakigoeConfig.SectionName).Get<NakigoeConfig>().Animal;
    services.AddSingleton<IAnimal>(provider =>
    {
        if(animalValue == "Dog")
            return new Dog();
        else
            return new Cat();
    });
}

動物クラスは以下のようにしています。

public interface IAnimal
{
    void Nakigoe();
}

public class Dog : IAnimal
{
    public void Nakigoe() => Console.WriteLine("ワンワン!");
}

public class Cat : IAnimal
{
    public void Nakigoe() => Console.WriteLine("にゃー!");
}

出力結果

出力結果はそれぞれ以下のようになります。

ワンワン!  <--appsettings.jsonのAnimal項目にてDogが設定されたとき
にゃー!    <--appsettings.jsonのAnimal項目にてDog以外が設定されたとき

今回だったらこっちでも良さそう。

ちなみに上記に記載した方法はマイクロソフト公式解説書である『プログラミング ASP.NET Core』を読んで知ったのですが、今回のサンプルコードだと以下でも良さそうです。

public void ConfigureServices(IServiceCollection services)
{
    // appsettings.jsonから動物を選択
    var animalValue = Configuration.GetSection(NakigoeConfig.SectionName).Get<NakigoeConfig>().Animal;
    if(animalValue == "Dog")
        services.AddSingleton<IAnimal, Dog>();
    else
        services.AddSingleton<IAnimal, Cat>();
}

前者だとコンストラクタ引数の自由度等も高いので、複雑なDIシステムの場合は前者で実装したほうが良さそうです。

おわりに

公式本も結構難しいですが、しっかり読み進めて知識を増やしていきたいと思います!