Asp.Net Core内蔵IOC容器の理解

3520 ワード

Asp.Net Core内蔵IOC容器の理解


01.IOC容器使用のメリット

  • インタフェースと実装クラスは、従来の分散管理から、現在の集中管理まで管理されています.
  • クラスとインタフェースの関係には、複数の注入モード(構造関数注入、属性注入など)がある.
  • は、実装クラスの宣言サイクルを統一的に管理します(作成、解放、監視).
  • クラスへの依存には、コンパイル時から実行時までがあります.

  • 02.実際の使用


    1.コンソールプロジェクトを作成し、Nugetパッケージ参照Nugetパッケージを追加する:Microsoft.Extensions.DependencyInjection 2.単純な使用
    class Program
    {
        static void Main(string[] args)
        {
    
            //     
            Bird bird = new Bird(); //IFly bird=new Bird();
            bird.Fly();
             
            //IOC  
            ServiceCollection serviceCollection = new ServiceCollection();  //  IOC  
            serviceCollection.AddTransient();                   //       
            var provider = serviceCollection.BuildServiceProvider();        //  Provider
            var fly = provider.GetService();                          //       
            fly.Fly();                                                      //  
        }
    }
    
    interface IFly
    {
        void Fly();
    }
    
    class Bird : IFly
    {
        public void Fly()
        {
            Console.WriteLine("     ........");
        }
    }

    3.ログ登録
  • NetGutパッケージ:Microsoft.Extensions.Logging.Console
  • class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection serviceCollection = new ServiceCollection();
            //      
            serviceCollection.AddLogging(configure => 
                configure.AddConsole() 
                );
            serviceCollection.AddTransient();
            var provider = serviceCollection.BuildServiceProvider();
            provider.GetService();
            var fly = provider.GetService(); 
            fly.Fly();
    
        }
    }
    
    interface IFly
    {
        void Fly();
    }
    
    class Bird : IFly
    {
        private readonly ILogger _iLogger;
        public Bird(ILoggerFactory logger)
        { 
            _iLogger = logger.CreateLogger(); 
        }
        public void Fly()
        {
            _iLogger.Log(LogLevel.Information, "    .....");
            Console.WriteLine("     ........");
        }
    }

    4.ライフサイクル
  • AddTransientリクエストごとに
  • が作成されます.
  • AddSingleton単例モード
  • AddScopedスコープ(範囲)内は、一例モード
  • である.
    AddScopedケースコード
    class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection serviceCollection = new ServiceCollection();
            ////       
            //serviceCollection.AddTransient();
            ////    ,      
            //serviceCollection.AddSingleton();
            //          
            serviceCollection.AddScoped();
             
            var provider = serviceCollection.BuildServiceProvider();
            //    scope
            var scope1 = provider.CreateScope();
            var scope2 = provider.CreateScope();
            //      
            scope1.ServiceProvider.GetService();
            //      
            scope2.ServiceProvider.GetService();
            //         :        
            var fly = provider.GetService();//   
            fly = provider.GetService();//   
            fly.Fly(); 
        }
    }
    
    interface IFly
    {
        void Fly();
    }
    
    class Bird : IFly
    {
    
        public Bird()
        {
            Console.WriteLine("       ......");
        }
        public void Fly()
        {
            Console.WriteLine("     ........");
        }
    }
    

    実行結果:三次構造関数が呼び出されました....