Asp.Netcore学習ノート--(1)依存注入

4357 ワード

依存注入


依存注入はソフトウェアの設計技術であり、主にクラスとクラスの結合を解決しています.この設計テクニックは、オブジェクト向けに設計された「依存逆転」の原則を満たしています.クラスとクラスの間には相互依存せず、インタフェースに依存しなければなりません.例えばcontrollerでは「AccessDataBase」のタイプが必要で、データベースの検索を行うために、このAccessDataBaseクラスで実現された機能をインタフェースにして、このクラスにこのインタフェースを実現させ、その後、このクラスが必要な場所で(この例ではcontroller)は彼にインタフェースを挿入し、DI容器を通じて具体的な実装を提供する.DI容器はこれです.asp.Netcoreには依存注入が内蔵されており、主にMicrosoftを介している.Extensions.DependencyInjectionのnugetパッケージで実現します.DIコンテナは、IServiceProviderのインタフェースによって実現されます.
 public interface IServiceProvider
    {
        object GetService(Type serviceType);
    }

このインタフェースは簡潔に見えますが、主にこのインタフェースのいくつかの拡張方法を使用しています.IServiceProviderはaspにあるIServiceCollectionというインタフェースを通じて生成します.Netcoreには具体的な実装があり、ServiceCollectionです.IServiceProviderを生成するには、次のコードを使用します.
IServiceProvider service=new ServiceCollection().BuildServiceProvider();

これは、この実装の過程で何も登録されていないため、最も簡単な実装です.

ライフサイクル


DI容器はインタフェースの具体的な実装を提供するだけでなく,この具体的な実装のライフサイクルを管理する.DIコンテナによって生成されるクラスを「提供されるサービス」と呼ぶ.提供されるクラスは「サービス」である.IServiceProviderはasp.net coreのDIコンテナであり、提供されるサービスは3つの異なる形式のライフサイクルで実現され、この3つのライフサイクルは1つの列挙に置かれる.
 public enum ServiceLifetime
    {
        //
        //   :
        //     Specifies that a single instance of the service will be created.
        Singleton = 0,
        //
        //   :
        //     Specifies that a new instance of the service will be created for each scope.
        //
        //   :
        //     In ASP.NET Core applications a scope is created around each server request.
        Scoped = 1,
        //
        //   :
        //     Specifies that a new instance of the service will be created every time it is
        //     requested.
        Transient = 2
    }

Singleton:アプリケーション内のすべての場所に1つしか現れず、このクラスのインスタンスはDIコンテナによってアプリケーションが終了するまで繰り返し提供されます.Transient:これはsingletonとは正反対です.それを呼び出す場所はDIコンテナによって新しいインスタンス(サービス)が生成される.Scoped:これは、各DIコンテナの中で一意であり、アプリケーションに複数のDIコンテナが生成されると、各DIコンテナの要求に対して一意のScopedのサービスが生成されることを意味します.一方、IServiceProviderといえばIServiceScope、具体的なIServiceProviderが提供するサービスのライフサイクルはIServiceScopeによって決定され、IServiceScopeはIServiceScopeFactoryによって提供される.先ほど述べたように、IServiceProviderは1つのServiceCollectionで実現できます.もう1つの方法は、IServiceProviderがIServiceScopeと協力して実現することです.
 static void Main(string[] args)
        {

  IServiceProvider root=new ServiceCollection().BuildServiceProvider();
  IServiceProvider child = root.GetService().CreateScope().ServiceProvider;
        }

重要なのは、まずサービスプロバイダを生成し、このサービスプロバイダを使用して別のサーバを生成することです.「親子関係」:例えば、上記のコードのrootとchildのような関係が形成されています.最終的には、serviceproviderが提供するクラスのライフサイクルの管理:singleton:このライフサイクルタイプのサービスのライフサイクルが「父親」に「管理を行います.他の2つのライフサイクルタイプのサービスは、それぞれ生成されたサービスプロバイダで管理されます.サービスの終了は、IServiceProviderがDisposeメソッドを呼び出したときに自動的に行われることに注意してください.しかし、この方法にも欠点があります.それは、サービスクラスがタイムリーに回収されないことです.より良い方法は、IServiceScopeを通じて:
using(IServiceScope scope=IServiceProvider.GetService().CreateScope()){
IServiceProvider service=Scope.ServiceProvider;
。。。。。。
}

以上が疑似コードです.
この記事ではIServiceProviderとDIコンテナとServiceProviderが同じ意味です.ここに説明する.この文章は私のaspに従います.Netcoreの理解は、後期復習のためにこのノートを作ることを目的として、より多くのものを加えています.