C#依存注入におけるScpoe概念について
依存注入AddScoped()メソッド
Singletonとtransientの2つの依存注入方式が分かりやすい.今日はScop eドメインへの依存注入の概念について説明します.直接例:
using System;
using Microsoft.Extensions.DependencyInjection;
namespace vscode_test5
{
interface IMyInfo
{
void PrintID();
}
public class MyInfo:IMyInfo,IDisposable
{
private string id;
public MyInfo(string guid)
{
id = guid;
}
public MyInfo():this(Guid.NewGuid().ToString())
{
}
public void PrintID()
{
System.Console.WriteLine(id);
}
public void Dispose()
{
System.Console.WriteLine($"disposed:{id}");
}
}
class Program
{
static void Main(string[] args)
{
IServiceCollection s = new ServiceCollection();
s.AddScoped(typeof(IMyInfo), typeof(MyInfo));
IServiceProvider sp = s.BuildServiceProvider(); // “ provider”
using(IServiceScope iss1 = sp.CreateScope()) // Scope , “ provider” provider
{
IMyInfo mf1 = iss1.ServiceProvider.GetService<IMyInfo>();// IMyInfo
mf1.PrintID();
IMyInfo mf2= iss1.ServiceProvider.GetService<IMyInfo>();// IMyInfo
mf2.PrintID();
}
using(IServiceScope iss2 = sp.CreateScope())
{
IMyInfo mf1 = iss2.ServiceProvider.GetService<IMyInfo>();// IMyInfo
mf1.PrintID();
IMyInfo mf2= iss2.ServiceProvider.GetService<IMyInfo>();// IMyInfo
mf2.PrintID();
}
using(IServiceScope iss3 = sp.CreateScope())
{
IMyInfo mf1 = iss3.ServiceProvider.GetService<IMyInfo>();// IMyInfo
mf1.PrintID();
IMyInfo mf2= iss3.ServiceProvider.GetService<IMyInfo>();// IMyInfo
mf2.PrintID();
}
}
}
}
実行結果:
8a77cb3e-f675-40d1-bd72-666e77630f40
8a77cb3e-f675-40d1-bd72-666e77630f40
disposed:8a77cb3e-f675-40d1-bd72-666e77630f40
40baa6e5-9d05-4838-ad1c-152d30290909
40baa6e5-9d05-4838-ad1c-152d30290909
disposed:40baa6e5-9d05-4838-ad1c-152d30290909
f0cfd64d-f0f8-437b-95d5-3830913d0bef
f0cfd64d-f0f8-437b-95d5-3830913d0bef
disposed:f0cfd64d-f0f8-437b-95d5-3830913d0bef
各using文はIServiceScopeドメインを作成し、この領域で2回も同じ値を取ります.USing文以外では、取得したScopedサービスが自動的に解放されるため、対応するサービスのDispose()メソッドが自動的に実行されます.もちろん、サービス実装はIDisposableインタフェースを実装しないことを許可する.
つまりこのusingブロック内のIServiceScopedが存在する生存サイクルは,Scopedサービスの生存サイクルである.