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サービスの生存サイクルである.