[ASP.NETコア3枠組みシークレット]設定[2]:コンフィギュレーションデータが読み出される[次]

[アクセス記事 ]「設定」言葉を意味し、私は.NET開発者の大半は気にすると思うすぐに、私たちはapp.configをしてweb.configファイルの精通していることを二つの特別なファイルの影のうち出現します長年にわたり、我々は2つのXML形式のファイル構造で定義された設定に慣れています。.NETのコアの時代に、付与されたもののために取る私たちの多くは、道定義された構成を含め、変更されています。全体的に、新しいコンフィギュレーション・システムは、より軽量で、より優れた拡張性を持って、その最大の特徴は、さまざまなデータソースのサポートです。データソース構成は、構成ファイルでも、永続的なデータベースを定義することができるよう私たちは、メモリ変数を使用することができます。システム導入のためのシステムを設定する前に、我々は設定を読み込むための新しい方法を体験するプログラミングの観点で始まります。

第四に、構造的な構成は、オブジェクトに直接結合します

実際のプロジェクトの開発プロセスでは、我々は、このようなプレゼンテーションインスタンスDateTimeFormatOptions、CurrencyDecimalOptionsとFormatOptionsオブジェクトとしてPOCOオブジェクトとして構成関連のグループを変換する例として、私たちのデモを好む傾向にあります。一例では、これらのオブジェクトのパッケージ構成を作成するために、我々はすべて手動でフォームを読み取るように構成されている、先に実証しました。もし設定項目の定義があまりにも多く、構成アイテムを読み込むための一つ一つは、実際には非常に面倒な作業です。

対応POCO型とオブジェクトIConfigurationベアラ構成データは互換性の構造を持っている場合、我々は、自動コンフィギュレーションの結合機構はIConfiguration POCOオブジェクトに対応するオブジェクトに直接変換することができる使用します。我々が実証されているこの例では、自動化された設定を使用してオブジェクトを作成するために結合のオプションに対応する場合、これらのタイプは、手動で不要になっバインドコンストラクタを実装します。

コンストラクタのすべてのタイプを削除した後のオプションは、我々はオプションオブジェクトを変更する方法を作成します。次のコードは、呼び出しの後に私たちはgetメソッドGetSection「フォーマット」構成セクション、およびコンストラクタを呼び出すことによって作成されたオブジェクトはもはやFormatOptionsを呼び出す方法、IConfigurationBuilder IConfigurationビルドに対応するオブジェクトを作成しますが、直接呼び出すために構成セクションのGet <T>、POCOオブジェクトからバインド間のメソッドIConfiguration完全な自動化。

パブリック クラスプログラム
{
    公共の 静的な 無効メイン()
    {
        VaRのソース= 新しい辞書< 文字列文字列 >
        {
            [ " フォーマット:dateTimeの:longDatePattern " ] = " DDDD、MMMMのD、YYYY " 
            [ " フォーマット:dateTimeの:longTimePattern " ] = " H:MM:SSのTT " 
            [ " フォーマット:dateTimeの:shortDatePattern " ] = " M / D / YYYY " 
            [ " フォーマット:dateTimeの:shortTimePattern " ] = " H:MMのTT " 

            [ " フォーマット:currencyDecimal:桁" ] = " 2 " 
            [ " フォーマット:currencyDecimal:記号" ] = " $ " 
        }。
       

         VARオプション=新しいConfigurationBuilder()
            .Add(新しいMemoryConfigurationSource {InitialDataは=ソース})
            .Build()
            .GetSection( "フォーマット")
            .get <FormatOptions>();                                                                                            

        VARのdateTime = options.DateTime。
        VAR currencyDecimal = options.CurrencyDecimal。

        Console.WriteLineを(" 日時:" );
        Console.WriteLineを($ " \ tLongDatePattern:{dateTime.LongDatePattern} " );
        Console.WriteLineを($ " \ tLongTimePattern:{dateTime.LongTimePattern} " );
        Console.WriteLineを($ " \ tShortDatePattern:{dateTime.ShortDatePattern} " );
        Console.WriteLineを($ " \ tShortTimePattern:{dateTime.ShortTimePattern} " );

        Console.WriteLineを(" CurrencyDecimal:" );
        Console.WriteLineを($ " \ tDigits:{currencyDecimal.Digits} " );
        Console.WriteLineを($ " \ tSymbol:{currencyDecimal.Symbol} " );
    }
}

修正プログラムを実行した後、我々は、図1に示すように同じ出力結果を得ることができます。

6-4

第五に、ファイルに定義されている構成

三つの例はMemoryConfigurationSourceの前で実証した構成ソースとして辞書オブジェクトに基づいており、我々はJSONファイル内の元の構成の内容の定義であること、より多くの一般的な構成はように定義されることを示します。我々は、ファイルの出力ディレクトリに辞書オブジェクトのメモリ構成定義は、「appsettings.json」というプロジェクトの構成ファイルのルートディレクトリにJSONファイルを行い作成し、「コピーこれで、持っていましたその目的は、出力ディレクトリにこのファイルをコピーすることができ、コンパイル時にプロジェクトを促進することで、「常にコピー「に属性セット」。我々は、日付/時間とお金に次の形式定義されたフォーマット構成を使用しています。

{
     "フォーマット" :{
         "dateTimeの" :{
             "longDatePattern": "DDDD、MMMMのD、YYYY"  "longTimePattern": "H:MM:SSのTT"  "shortDatePattern": "M / D / YYYY"  " shortTimePattern ": "H:MMのTT"
        }、
        "currencyDecimal" :{
             "数字":2  "シンボル": "$"
        }
    }
}

 

ソース構成は、交換する元MemoryConfigurationSourceのニーズ変化しているのでJsonConfigurationSourceを、私たちは手動でJsonConfigurationSourceは、単にコール拡張メソッドをオブジェクトIConfigurationBuilderインタフェースを作成する必要はありませんAddJsonFileを JSONファイルを指定した追加します。修正プログラムを実行し、図に示すように、我々はまだ、出力結果を取得します。

パブリッククラスプログラム
{
    公共の静的な無効メイン()
    {
       VARオプション=新しいConfigurationBuilder()
         .AddJsonFile( "appsettings.json")
         .Build()
         .GetSection( "フォーマット")
         .get <FormatOptions>();                                                                                         

        VARのdateTime = options.DateTime。
        VAR currencyDecimal = options.CurrencyDecimal。

        Console.WriteLineを( "日時:" );
        Console.WriteLineを($ "\ tLongDatePattern:{dateTime.LongDatePattern}" );
        Console.WriteLineを($ "\ tLongTimePattern:{dateTime.LongTimePattern}" );
        Console.WriteLineを($ "\ tShortDatePattern:{dateTime.ShortDatePattern}" );
        Console.WriteLineを($ "\ tShortTimePattern:{dateTime.ShortTimePattern}" );

        Console.WriteLineを( "CurrencyDecimal:" );
        Console.WriteLineを($ "\ tDigits:{currencyDecimal.Digits}" );
        Console.WriteLineを($ "\ tSymbol:{currencyDecimal.Symbol}" );
    }
}

第六に、環境の動的ローディングプロファイルに従って

実際のプロジェクトの開発プロセスは、多くの場合、異なる実行環境(開発、テスト、および事前の製品)である現在の実行環境を使用して、アプリケーションに依存して設定すると、異なる構成を使用します。コンフィギュレーションに基づいて物理ファイル場合、我々は異なる環境に対応するプロファイルを提供することができ、特定のアプローチは、(例えば「のような「基本プロファイル」を提供することに加えてappsettings.json」)外に、我々は、対応が必要通常(例えば「のような環境のファイル名の拡張子として使用され、対応する「差分」プロファイル、提供する環境appsettings.production.jsonを」)。

このプログラムの当社の現在のプレゼンテーションは、例えば、既存のプロファイルappsettings.jsonは環境が異なる設定を必要とする場合、我々は、対応するファイルの違いを定義するように構成することができ、基本的なコンフィギュレーション・ファイルとして使用することができます。以下に示すように、我々は、各製品に対応するファイル名が予備発泡及び環境で見ることができるから、二つの追加のプロファイル(appsettings.staging.jsonとappsettings.production.json)を加えました。

6-5

我々は両方のプロファイルの環境での差別化を定義するために設定する必要がありますので、環境事前環境と本番環境は、異なる通貨フォーマットを必要とすることを想定し、日付/時刻と通貨の形式用に設定JSONファイルを定義しますそれは。簡単にするために、我々は唯一の小数通貨は、設定ファイルで定義されています。次のコードは、小数点の通貨(デフォルトは2である)予め3及び4に設定され、本番環境されています。

appsettings.staging.json:

{
     "フォーマット" :{
         "currencyDecimal" :{
             "数字" 3
        }
    }
}

 

appsettings.production.json:

{
     "フォーマット" :{
         "currencyDecimal" :{
             "数字":4
        }
    }
}

 

一般的に、我々は、アプリケーションの実行環境を決定するために環境変数を使用しますが、柔軟にプレゼンテーション中に環境を切り替えることができるようにするために、我々は、(例えば、「などのコマンドライン引数を使用/ステージングのenv環境を設定するためのフォームを」)。これまでのところ、2は、その後、我々はちょうどスタートアップファイルに動的に現在の実行環境に基づいて、対応するコンフィギュレーション・ファイルをロードする必要があり、環境のためのプロファイルを設定するために配布されます。2つの構成ファイルが同じ段落に関連する場合は、現在の環境は、そのファイルに対応する好適な構成にする必要があります。デフォルトの設定では、それが第1の基本構成ファイルをロードする必要がありますので、「キャッチアップ」して、環境のための設定ファイルを読み込むの原理を使用しているため。コードに反映された環境をロードするための構成および実行環境を決定するために、以下に示すスニペット。

クラスプログラム
{
    静的な 無効メイン(文字列[] argsを)
    {
        VaRのインデックス= Array.IndexOf(argsを、" / ENV " );
        VaRの環境=インデックス> - 1引数[インデックス+ 1 ]開発

        VaRのオプション= 新しいConfigurationBuilder()
            .AddJsonFile(" appsettings.json "
            .AddJsonFile($ " のAppSettings。{環境} .json "
            .Build()
            .GetSection(" フォーマット" 
            .get <FormatOptions> ();
        ...
    }
}

 

上記のコードフラグメントに示すように、コマンドライン引数が渡さ使用して、現在の実行環境を決定した後、私たちは、その後、2つのファイルの内容をマージし、負荷への2つの構成ファイルに来るIConfigurationBuilderオブジェクトAddJsonFileメソッドを2回呼び出しを持っていますビルド方法はIConfigurationが作成されたオブジェクトを構築するために使用されます。次に、我々は、コマンドラインの形式でコンソールプログラムを起動し、コマンドラインパラメータを通じて環境の名前を指定します。それは環境に対応するが、実際にプロファイルから導出される(通貨は場所を10進数)図6-6コンフィグレーションデータに示される出力印刷結果から見ることができます。(S605)

6-6

セブン同期プロファイル

多くの場合は、アプリケーションが唯一の適切なコンフィギュレーション・ソースからの起動時に読み込まれます設定、そして我々は、構成再構築を更新する必要があると、アプリケーションの生涯変わらずで、我々は、アプリケーションを再起動する必要があります。.NETコア構成モデルは、コンフィギュレーション・ソースの機能を監視提供し、それは、元のアプリケーションの構成変更通知が時間内に受信することができた後に一度、我々は、コールバック予め登録設定の同期化を使用することができることを保証することができます。

私たちは、アプリケーションがファイルの変化を感知し、自動的に新しいコンフィギュレーション・ファイルをロードできるようにしたいので、JSONのソースを使用して設定ファイルとして私たちのデモアプリケーションは、とき比率を再適用プログラムに変更されます。同期用に構成さを証明するために、プログラムは、私たちには、以下の変更を加えました。

クラスプログラム
{
    静的な 無効メイン()
    {
        VaRの設定= 新しいConfigurationBuilder()
            .AddJsonFile(path: "appsettings.json",optional:true,reloadOnChange: true)
            .Build();
        ChangeToken.OnChange(() => config.GetReloadToken(), () =>
        {
            var options = config.GetSection("format").Get<FormatOptions>();
            var dateTime = options.DateTime;
            var currencyDecimal = options.CurrencyDecimal;

            Console.WriteLine("DateTime:");
            Console.WriteLine($"\tLongDatePattern: {dateTime.LongDatePattern}");
            Console.WriteLine($"\tLongTimePattern: {dateTime.LongTimePattern}");
            Console.WriteLine($"\tShortDatePattern: {dateTime.ShortDatePattern}");
            Console.WriteLine($"\tShortTimePattern: {dateTime.ShortTimePattern}");

            Console.WriteLine("CurrencyDecimal:");
            Console.WriteLine($"\tDigits:{currencyDecimal.Digits}");
            Console.WriteLine($"\tSymbol:{currencyDecimal.Symbol}\n\n");
        }); 
        Console.Read();
    }
}

 

表示JSON文件配置源的JsonConfigurationSource在默认的情况下并不会监控源文件的变化,所以我们需要在调用IConfigurationBuilder的扩展方法AddJsonFile的时候,通过传入的reloadOnChange参数开启这个功能。通过IConfigurationBuilder的Build方法创建的IConfiguration对象具有一个返回类型为IChangeToken的GetReloadToken方法,我们正是利用它返回的IChangeToken来感知配置源的变化。一旦配置源发生变化,IConfiguration对象将自动加载新的内容,所以我们只需要通过注册的回调将同一个IConfiguration对象应用到程序之中就可以。

我们的程序会在感知到配置源变化后自动将新的配置内容打印出来,所以当该程序被启动之后,我们对appsettings.json文件所做的任何修改都会触发应用对该文件的重新加载。下图所示的输出是我们两次修改货币小数位数导致的。

6-7

[ASP.NETコア3枠組みシークレット]の構成[1]:リード構成データ[パート]
[ASP.NETコア3枠組みシークレット]設定[2]:コンフィギュレーションデータが読み出される[次]
[ASP.NETコア3秘密フレーム]構成[3]:全体的な設計構成モデル
[ASP.NETコア3フレームワーク秘密]構成[4]:ボンディング構成オブジェクト
[ASP.NETコア3フレームワーク秘密]構成[5]:コンフィギュレーションデータとデータリアルタイム同期ソース
[ASP.NETコア3枠組みシークレット]構成[6]:多様な構成ソース[パート]
[ASP.NETコア3枠組みシークレット]構成[7]:多様な構成ソース[媒体の長さ]
[ASP.NETコア3枠組みシークレット]構成[8]:多様な構成ソース[次]
[ASP.NETコア3枠組みシークレット]構成[9]:カスタム設定ソース

おすすめ

転載: www.cnblogs.com/artech/p/inside-asp-net-core-05-02.html