ASP.NET MVCコアの依存性注入コントローラ

  ASP.NET MVCのコア・コントローラは、いくつかのケースでは、単一のコントローラには意味を持たないかもしれないコントローラレベルでのサービス要求を動作させるために必要な場合があり、コンストラクタを明示的依存関係を介してそれらを要求する必要があります。この場合、それはまた、アクションのパラメータとしての役割を果たすことができます。

  依存性注入は、依存性逆転原理は、疎結合アプリケーション、モジュール構成を可能に示されているような技術です。

1.コンストラクタ・インジェクション

  ASP.NETコアは、MVCコントローラに拡張ベースのコンストラクタ依存性注入のサポートを構築しました。コンストラクタコントローラへのパラメータとしてのみサービスタイプを追加することにより、ASP.NETコアサービスコンテナは、組み込み解決このタイプを使用しようとします。サービスは、インタフェース定義を使用して(常にではない)通常です。例えば、アプリケーションは、サービス検索時間を定義している場合、その代わりにハードコーディング依存性注入の:

  インタフェースを定義し、実装します。

名前空間MVCTest.Services 
{ 
    パブリック インターフェイスIDateTime 
    { 
        DateTimeの今{ 取得します} 
    } 
    パブリック クラスSystemDateTime:IDateTime 
    { 
        公共のDateTime今
        { 
            取得 { 戻りますDateTime.Nowを。} 
        } 
    } 
}

  ConfigureServicesでは、コンテナにサービスを登録:

services.AddTransient <IDateTime、SystemDateTime>();

  コントロールであっ

    パブリック クラスDateTimeController:コントローラー
    { 
        プライベートIDateTime _dateTime。
        公共DateTimeController(IDateTimeたdateTime)
        { 
            _dateTime = たdateTime。
        } 
        // GET:DateTimeの
        公共のActionResultインデックス()
        { 
            VAR SERVERTIME = _dateTime.Now。
            もし(serverTime.Hour < 12 
            { 
                ViewDataを[ " メッセージ" ] = " グッドモーニング" 
            }
            返すビューを(); 
        } 
}

  ASP.NETコアは、組み込みのサービス要求の依存性注入タイプのサポートだけで1つのコンストラクタを持つことができ、複数の例外場合は報告されます。デフォルトの依存性注入を置き換えるために、サードパーティを使用して実装され、複数のコンストラクタをサポートするために実装することができます。

 

2.動作注射FromServices

  時々、必要ではないコントローラの動作の複数のサービスを提供します。この場合、オペレーティング注入の方法にサービスパラメータが重要です。[FromServices]マークアップパラメータによって達成:

        公共のActionResultインデックス([FromServices] IDateTime _dateTime)
        { 
            VAR SERVERTIME = _dateTime.Now。
            もし(serverTime.Hour < 12 
            { 
                ViewDataを[ " メッセージ" ] = " グッドモーニング" 
            } 
            を返す)(ビュー。
        }

 

3.アクセスは、コントローラに設けられています

  コントローラにはアプリケーションの設定にアクセスしたり、共通設定モードを設定します。このアクセスモードは設定で説明したアクセスに使用する必要があります。一般に、コントローラからの要求を向けるべきである依存性注入が設けられている、より良い方法はIOptions <T>インスタンスを要求することであり、Tは、コンフィギュレーションの所望のタイプです。例えば:

  オプションのカテゴリを作成:

パブリック クラスAppSettingOptions 
    { 
        公共 DefaultConnecのconnectionStrings { 取得しますセット; }
         パブリック 文字列 AllowedHosts { 得ますセット; } 
    } 

    パブリック クラスDefaultConnec 
    { 
        パブリック 文字列 DefaultConnectionを{ 得ますセット; } 
    }

appsettings.json:

{
   " のconnectionStrings " :{
     " DefaultConnectionを"" データソース= .;初期カタログ=テスト;統合セキュリティ=真" 
  }、
  " ログ" :{
     " ログレベル" :{
       " デフォルト"" 情報" 
    } 
  }、
  " AllowedHosts "" * " 
}

  アプリケーションモデルを設定するためのオプションを使用すると、コンフィギュレーション・クラスは、サービスコンテナにConfigureServicesをに追加します。

公共起動(IConfiguration構成、IHostingEnvironmentのENV)
        { 
            // 設定=構成; 
            VaRのビルダー= 新しいConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                (.AddJsonFile " appsettings.json ":オプション、 reloadOnChange、:// "のAppSettings {} env.EnvironmentName .json" .AddJsonFile($オプション:真)
                ; 

            // 配置环境变量
             // builder.AddEnvironmentVariables(); 
            設定=builder.Build(); 
        } 

        公共 IConfiguration設定{ 取得します} 

        // このメソッドはランタイムによって呼び出されます。コンテナにサービスを追加するには、このメソッドを使用します。
        公共 のボイドConfigureServices(IServiceCollectionサービス)
        { 
            services.AddOptions(); 
            services.Configure <AppSettingOptions> 構成);
            // 通过代码编写 
            services.Configure <AppSettingOptions>(オプション=> 
            { 
                options.AllowedHosts = " テスト" ;  
            });
        }

  例はappsettings.jsonからの読み出しが設けられている、コードに設け添加してもよいです。

  指定された構成オブジェクトAppSettingOptionsの要求されたタイプと、サービス・コンテナに追加し、それがコントローラを操作する方法によって取得することができるか、または<AppSettingOptions>としてはIOptionsを要求します。

    パブリック クラスにHomeController:コントローラ
    { 
        プライベート 読み取り専用 IOptions <AppSettingOptions> _options。
        公的にHomeController(IOptions <AppSettingOptions> オプション)
        { 
            _optionsの =のオプション。
        } 
}

  設定する場所についての情報を見つける方法を知っておく必要がありませんので、あなたが設定し、互いに分離、設定、およびコントローラは関心事の分離を、次のことを確保することを可能にするモードオプションに従ってください。コントローラは、クラスのインスタンスでないか、または直接、したがって、それは容易コントローラユニットテストを使用すること、静的クラスの設定に取り付けられているからです。

 

 

 

 

おすすめ

転載: www.cnblogs.com/afei-24/p/11367425.html