この記事の内容
この記事では、.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 } } } }
コメント