.NET Core Console ApplicationでDIコンテナを使用する

csharp C#

この記事の内容

この記事では、.NET CoreでDIコンテナを使用する方法について解説します。

環境は、.NET Core 3.1で実施しており、Console Applicationにて実行しています。

環境構築

.NET Core 3.1でプロジェクトを作成します。

Nugetで以下をインストールします。

  • Microsoft.Extensions.DependencyInjection

DIコンテナの取得種別

DIのインスタンス取得方法は3種類あるので以下に説明を記載します。

名前 説明
Singleton 取得する際に同一のインスタンスを返却します。
Transient 取得するたびに、インスタンスが生成され、そのインスタンスを取得します。
Scoped 指定したスコープ内での取得では、同一のインスタンスが取得できます。

スコープが異なれば、別のインスタンスとなります。

DIコンテナを使用してみる

それでは、実際にDIコンテナを使用してみます。ここでは、取得方法に合わせたインターフェースを用意し(ISingleton、ITransient、IScoped)、それを実装するクラス(Service)を用意します。

インスタンスの生成タイミングがわかるようにServiceクラスでは生成するごとに一意のIDを生成し、そのIDを返却するメソッドを用意します。

具体的なコードは以下の通りです。

ISingleton

namespace ConsoleApp1
{
    public interface ISingleton
    {
        string GetMessage();
    }
}

ITransient

namespace ConsoleApp1
{
    public interface ITransient
    {
        string GetMessage();
    }
}

IScoped

namespace ConsoleApp1
{
    public interface IScoped
    {
        string GetMessage();
    }
}

Service

namespace ConsoleApp1
{
    public class Service : ISingleton, ITransient, IScoped
    {
        string _id;

        public Service()
        {
            _id = Guid.NewGuid().ToString();
        }

        public string GetMessage()
        {
            return _id;
        }
    }
}

これらのインターフェース、クラスを使用するコードが以下になります。

それぞれ、GetMessageで取得した値を出力していますが、その値を見ると、インスタンス生成タイミングがつかめるかと思います。

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            // DIコンテナに登録
            IServiceCollection services = new ServiceCollection();
            services.AddSingleton<ISingleton, Service>();
            services.AddTransient<ITransient, Service>();
            services.AddScoped<IScoped, Service>();

            //Provider取得
            IServiceProvider provider = services.BuildServiceProvider();

            ///////////////////////////////////
            // Singleton
            ///////////////////////////////////
            ISingleton singleton1 = provider.GetRequiredService();
            Console.WriteLine($"singleton1:{singleton1.GetMessage()}");
            // > singleton1:06d625f2-51bd-4268-b505-2a83dca5f5ea

            ISingleton singleton2 = provider.GetRequiredService();
            Console.WriteLine($"singleton2:{singleton1.GetMessage()}");
            // > singleton2:06d625f2-51bd-4268-b505-2a83dca5f5ea


            ISingleton singleton3 = provider.GetRequiredService();
            Console.WriteLine($"singleton3:{singleton1.GetMessage()}");
            // > singleton3:06d625f2-51bd-4268-b505-2a83dca5f5ea

            ///////////////////////////////////
            // Transient
            ///////////////////////////////////
            ITransient transient1 = provider.GetRequiredService();
            Console.WriteLine($"transient1:{transient1.GetMessage()}");
            // > transient1:c7f8370a-669b-49f7-b261-294c00b1bc87

            ITransient transient2 = provider.GetRequiredService();
            Console.WriteLine($"transient2:{transient2.GetMessage()}");
            // > transient2:9d3ccd8b-d266-4c6f-b093-52827d7d0a9a

            ITransient transient3 = provider.GetRequiredService();
            Console.WriteLine($"transient3:{transient3.GetMessage()}");
            // > transient3:725aa6d5-cfc2-492e-a2c7-1d90d26d554d


            ///////////////////////////////////
            // Scoped
            ///////////////////////////////////
            using (IServiceScope serviceScope = provider.CreateScope())
            {
                IScoped scoped1 = serviceScope.ServiceProvider.GetRequiredService();
                Console.WriteLine($"scoped1:{scoped1.GetMessage()}");
                // > scoped1:4e756457-ceac-4a48-9f95-d3e9e7ebed47

                IScoped scoped2 = serviceScope.ServiceProvider.GetRequiredService();
                Console.WriteLine($"scoped2:{scoped2.GetMessage()}");
                // > scoped2:4e756457-ceac-4a48-9f95-d3e9e7ebed47
            }

            using (IServiceScope serviceScope = provider.CreateScope())
            {
                IScoped scoped3 = serviceScope.ServiceProvider.GetRequiredService();
                Console.WriteLine($"scoped3:{scoped3.GetMessage()}");
                // > scoped3:c5dd60bc-424b-46a3-af37-871e8530938c

                IScoped scoped4 = serviceScope.ServiceProvider.GetRequiredService();
                Console.WriteLine($"scoped4:{scoped4.GetMessage()}");
                // > scoped4:c5dd60bc-424b-46a3-af37-871e8530938c
            }
        }
    }
}

コメント