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


コメント