設定は、キーと値のペアの簡単な原子構造で、キーと値は文字列ですが、実際のプロジェクト開発に、我々は一般的に、単純な構成で使用するキーと値のペアの形式でありません。推奨されるアプローチを使用することです「システムの新しい設定を[1] .NETのコアは、使用しています:コンフィギュレーション・データを読み取る」道の最後のデモ関連の設定はオプションの型として定義され、構造体を使用し、元を定義するために型定義を一致させたいです設定は、[オプションオブジェクトバインディング設定データを読み込みますそれらの間のマッピング関係を使用することができますので、我々はこのプログラミングモード「と呼ばれますオプションモード。」[この記事では、「に同期されたASP.NETフレームワークコアの秘密の中で」]
内容
I.はバインド
2、拡張メソッドのAddOptions
第三に、拡張メソッドを設定し
、第四のオブジェクトのオプションを作成します
まず、バインディングを設定します
我々は、その子ノードとして考え、そのデータメンバ(これは主にメンバーを意味属性)にある場合、ターゲットのオプションは、[オプションはまた構造で表現木および構成オブジェクトで構成されている階層ツリー構造を持つオブジェクト基本的に違いはありません。オプション後者はオプションのオブジェクトの対応するタイプに結合する構成マッチング構造を有するデータメンバ定義ツリー構造のタイプは、標的対応する設定オプションオブジェクトに結合する、非常に簡単なものである場合動作はと呼ばれる「バインディングを設定します。」
結合構成は、対応する設定オプションの結合を与えるためにインタフェースIConfiguration GetValueメソッドとして定義され、関連するAPIの定義「Microsoft.Extensions.Configuration.Binder」NuGetこのパッケージで得られたオブジェクトに係るオブジェクトたちが生成することができオプションには、オブジェクトを生成しました。手放すには、この呼び出しでは、我々は、パラメータ、設定オプションのオブジェクトに運ばれるバインディングの構成データとして空のオプションやオブジェクトを作成します。
1:パブリック静的クラスConfigurationBinder
2:{
3:パブリック静的ボイドバインド(このIConfiguration設定、オブジェクト・インスタンス)。
4:}
単純なタイプとすることができる結合標的を構成するプリミティブ型、またはあってもよいカスタムデータ型、あってもよい配列、セット一緒に又は辞書タイプ。異なるターゲット・タイプのための結合構成プロセス中に、上述のバインド方法は、異なる戦略を採用します。現在の焦点は、このメソッドをコールする方法の後ろに所望のオブジェクトを得るために使用されるAPIオプションオプションモードの導入であるが実装原理の具体的方法として、我々は別々に、後続のセクションで説明します。
私たちは見て「で使用される新しい.NETのコアのシステム構成[1]:コンフィギュレーションデータの読み取り」の構成例を読み取るためのオプションを使用してデモモードを。オプションのモデルは、依存性注入のアプリケーションであり、我々はプログラミングのための依存性注入のみが2つの側面が含ま知っている、すなわちServiceCollectionオブジェクトに対応するサービスを登録し、我々は後者を使用してサービスを提供する必要があるオブジェクトは、対応のServiceProviderを作成します。次のコードに示すように、最終的な目標は、型IOptions結合設定値オプションオブジェクトによって生成された<TOptions>サービスオブジェクトのパターンを得るのServiceProviderオプションを使用することです。2つの拡張メソッドAddOptionsを意味し、設定<TOptions>必要なサービスを登録し、必要なサービスオブジェクトを得るために。
1:IConfiguration設定= ...;
2:FormatOptionsオプション=新しいServiceCollection()
3:.AddOptions()
4:.Configure <FormatOptions>(config.GetSection( "フォーマット"))
5:.BuildServiceProvider()
6:.GetService <IOptions <FormatOptions >>()
7:.Valueの。
第二に、拡張メソッドのAddOptions
オプションのオブジェクトがまだ<TOptions>顧客が得るタイプIOptionsの使用依存性注入を作成するための究極の方法で、私たちは、このインターフェイスを理解するために最初に見えます。これは正式なオプションの一般的なタイプのインターフェイス、TOptions対応するジェネリックパラメータ型コードオブジェクトです。IOptions <TOptions>インターフェースは以下に定義され、それが唯一の単一の読み取り専用プロパティの値は、我々はオプションを必要とするオブジェクトを返します。
1:パブリックインターフェイスIOptionsは<アウトTOptions>ここTOptions:新しいクラス、()
2:{
3:TOptions値{得ます。}
4:}
我々はAddOptionsのServiceCollectionを呼び出すと、メソッドは、OptionsManagerに本物のサービスのこのタイプは、<TOptions>、登録されたサービス・ライフサイクル・モデルはシングルトンに使用このタイプのサービスに登録するための唯一の方法を以下のようです。換言すれば、結合の構成が生成されるオプションオブジェクトが実際に作成最終OptionsManager <TOptions>によって返されます。
1:パブリック静的IServiceCollectionのAddOptions(このIServiceCollectionサービス)
2:{
3:services.TryAdd(ServiceDescriptor.Singleton(typeof演算(IOptions <>)、typeof演算(OptionsManager <>)))。
4:リターン・サービス。
5:}
あるOptionsManager <TOptions>以下に示すように、我々は、対応するオブジェクトタイプを達成するとインターフェースをConfigureOptionsと呼ばれ、それがパラメータとして設定コンストラクタ要素型IConfigureOptionsを<TOptions>受け付ける確認でき定義タイプ< TOptions>。IConfigureOptions <TOptions>インターフェイスは、入力パラメータとしてオプションオブジェクトの一意の方法を設定し定義します。タイプアクション<TOptions>、その実装型ConfigureOptions用ので<TOptions>、直接作用を介して、対応するオブジェクト<TOptions>オブジェクトとデリゲートオブジェクトConfigureOptions <TOptions>オブジェクトの役割の定義から分かるように作成します。
1:パブリッククラスOptionsManager <TOptions>:IOptions <TOptions>ここでTOptions:クラス、新しいです()
2:{
3:公共OptionsManager(IEnumerableを<IConfigureOptions <TOptions >>セットアップ)。
4:パブリック仮想TOptions値{取得します。}
5:}
6:
クラス:7:TOptions <TOptions中>パブリック・インタフェースIConfigureOptions
8:{
9:無効設定(TOptionsオプション)。
10:}
11:
12:パブリッククラスConfigureOptions <TOptions>:IConfigureOptions <TOptions> TOptions:クラス、新しいです()
13:{
14:公共のアクション<TOptions>アクション{取得します。プライベートセット; }
15:公共ConfigureOptions(アクション<TOptions>アクション)
16:{
17:this.Action =アクション。
18:}
19:公共の無効設定(TOptionsオプション)
20:{
21:this.Action(オプション)。
22:}
23:}
オブジェクトを作成するためのオプションがOptionsManager <TOptions>タイプのValueプロパティに反映しました。プロパティの実現は非常に簡単です、それは最初の空のオプションをオブジェクトを作成し、返す前に、それはConfigureOptionsを初期化するために、その指定した時間を提出します(オプションタイプはデフォルトの引数なしのコンストラクタを持たなければなりません)デフォルト引数なしのコンストラクタを呼び出します< TOptions>は一つのオブジェクトを処理しました。疑いの余地はBindメソッドは確かに全体のプロセスに<TOptions>オブジェクトによるConfigureOptions参加、特定の性質であり、約別の拡張メソッドの構成を達成するために呼び出す、があります。
第三に、拡張メソッドの設定
ServiceCollectionモードのオプションが2つのしか拡張メソッド(AddOptionsと設定<TOptions>)が含まれ、前者は<TOptions> / OptionsManager <TOptions>今度はそれサービス登録の種類作らServiceCollection、上に登録されたIOptionsに役立つのだろうか?
1:パブリック静的IServiceCollection設定<TOptions>(このIServiceCollectionサービス、IConfiguration設定)TOptions:クラス
2:{
3:services.AddSingletonを返す<IConfigureOptions <TOptions >>(新しいConfigureFromConfigurationOptions <TOptions>(設定));
4:}
5:
6:パブリッククラスConfigureFromConfigurationOptions <TOptions>:ConfigureOptions <TOptions>ここでTOptions:クラス
7: {
8:公共ConfigureFromConfigurationOptions(IConfiguration設定)
9:ベース(オプション=> config.Bind(オプション))
10:{}
11:}
我々は、指定されたオブジェクトがConfigureFromConfigurationOptions構成オブジェクトを作成し、サービスタイプIConfigureOptions <TOptions> ServiceCollectionに登録され、使用される使用する拡張メソッドServiceCollection設定<TOptions>を呼び出すと、上記のコード断片から分かるようにシングルトンのためのライフサイクルモデル。ConfigureFromConfigurationOptionsの種類については、後継者のそれはConfigureOptionsある<TOptions>タイプは、前述した、オブジェクトを作成する拡張メソッドBind設定オブジェクトと、最終的な構成バインディングを呼び出すことによってアクション<TOptions>デリゲートオブジェクトを指定しました。
第四に、オブジェクトのオプションを作成します
コアにServiceCollectionに2つのサービスを登録するオプションプログラミングモードの後ろ、サービスインタフェースを対応するこれら2つのサービスは、後に、IOptions <TOptions>とIConfigureOptions <TOptions>、前者直接結合オプション究極オブジェクト構成データでありますオプションのオブジェクトその前の実施例対応する初期化に戻されます。2つのサービスが指定ServiceCollectionに拡張メソッドのAddOptionsおよび構成方法によって登録され、サービスの実際のタイプはConfigureOptions <TOptions>に由来するOptionsManager <TOptions>とConfigureFromConfigurationOptions <TOptions>です。同図に示すモデルとその間に関与するこれらのインタフェースUML /オプションの種類の関係を反映しています。
設定は、キーと値のペアの簡単な原子構造で、キーと値は文字列ですが、実際のプロジェクト開発に、我々は一般的に、単純な構成で使用するキーと値のペアの形式でありません。推奨されるアプローチを使用することです「システムの新しい設定を[1] .NETのコアは、使用しています:コンフィギュレーション・データを読み取る」道の最後のデモ関連の設定はオプションの型として定義され、構造体を使用し、元を定義するために型定義を一致させたいです設定は、[オプションオブジェクトバインディング設定データを読み込みますそれらの間のマッピング関係を使用することができますので、我々はこのプログラミングモード「と呼ばれますオプションモード。」[この記事では、「に同期されたASP.NETフレームワークコアの秘密の中で」]
内容
I.はバインド
2、拡張メソッドのAddOptions
第三に、拡張メソッドを設定し
、第四のオブジェクトのオプションを作成します
まず、バインディングを設定します
我々は、その子ノードとして考え、そのデータメンバ(これは主にメンバーを意味属性)にある場合、ターゲットのオプションは、[オプションはまた構造で表現木および構成オブジェクトで構成されている階層ツリー構造を持つオブジェクト基本的に違いはありません。オプション後者はオプションのオブジェクトの対応するタイプに結合する構成マッチング構造を有するデータメンバ定義ツリー構造のタイプは、標的対応する設定オプションオブジェクトに結合する、非常に簡単なものである場合動作はと呼ばれる「バインディングを設定します。」
結合構成は、対応する設定オプションの結合を与えるためにインタフェースIConfiguration GetValueメソッドとして定義され、関連するAPIの定義「Microsoft.Extensions.Configuration.Binder」NuGetこのパッケージで得られたオブジェクトに係るオブジェクトたちが生成することができオプションには、オブジェクトを生成しました。手放すには、この呼び出しでは、我々は、パラメータ、設定オプションのオブジェクトに運ばれるバインディングの構成データとして空のオプションやオブジェクトを作成します。
1:パブリック静的クラスConfigurationBinder
2:{
3:パブリック静的ボイドバインド(このIConfiguration設定、オブジェクト・インスタンス)。
4:}
単純なタイプとすることができる結合標的を構成するプリミティブ型、またはあってもよいカスタムデータ型、あってもよい配列、セット一緒に又は辞書タイプ。異なるターゲット・タイプのための結合構成プロセス中に、上述のバインド方法は、異なる戦略を採用します。現在の焦点は、このメソッドをコールする方法の後ろに所望のオブジェクトを得るために使用されるAPIオプションオプションモードの導入であるが実装原理の具体的方法として、我々は別々に、後続のセクションで説明します。
私たちは見て「で使用される新しい.NETのコアのシステム構成[1]:コンフィギュレーションデータの読み取り」の構成例を読み取るためのオプションを使用してデモモードを。オプションのモデルは、依存性注入のアプリケーションであり、我々はプログラミングのための依存性注入のみが2つの側面が含ま知っている、すなわちServiceCollectionオブジェクトに対応するサービスを登録し、我々は後者を使用してサービスを提供する必要があるオブジェクトは、対応のServiceProviderを作成します。次のコードに示すように、最終的な目標は、型IOptions結合設定値オプションオブジェクトによって生成された<TOptions>サービスオブジェクトのパターンを得るのServiceProviderオプションを使用することです。2つの拡張メソッドAddOptionsを意味し、設定<TOptions>必要なサービスを登録し、必要なサービスオブジェクトを得るために。
1:IConfiguration設定= ...;
2:FormatOptionsオプション=新しいServiceCollection()
3:.AddOptions()
4:.Configure <FormatOptions>(config.GetSection( "フォーマット"))
5:.BuildServiceProvider()
6:.GetService <IOptions <FormatOptions >>()
7:.Valueの。
第二に、拡張メソッドのAddOptions
オプションのオブジェクトがまだ<TOptions>顧客が得るタイプIOptionsの使用依存性注入を作成するための究極の方法で、私たちは、このインターフェイスを理解するために最初に見えます。これは正式なオプションの一般的なタイプのインターフェイス、TOptions対応するジェネリックパラメータ型コードオブジェクトです。IOptions <TOptions>インターフェースは以下に定義され、それが唯一の単一の読み取り専用プロパティの値は、我々はオプションを必要とするオブジェクトを返します。
1:パブリックインターフェイスIOptionsは<アウトTOptions>ここTOptions:新しいクラス、()
2:{
3:TOptions値{得ます。}
4:}
我々はAddOptionsのServiceCollectionを呼び出すと、メソッドは、OptionsManagerに本物のサービスのこのタイプは、<TOptions>、登録されたサービス・ライフサイクル・モデルはシングルトンに使用このタイプのサービスに登録するための唯一の方法を以下のようです。換言すれば、結合の構成が生成されるオプションオブジェクトが実際に作成最終OptionsManager <TOptions>によって返されます。
1:パブリック静的IServiceCollectionのAddOptions(このIServiceCollectionサービス)
2:{
3:services.TryAdd(ServiceDescriptor.Singleton(typeof演算(IOptions <>)、typeof演算(OptionsManager <>)))。
4:リターン・サービス。
5:}
あるOptionsManager <TOptions>以下に示すように、我々は、対応するオブジェクトタイプを達成するとインターフェースをConfigureOptionsと呼ばれ、それがパラメータとして設定コンストラクタ要素型IConfigureOptionsを<TOptions>受け付ける確認でき定義タイプ< TOptions>。IConfigureOptions <TOptions>インターフェイスは、入力パラメータとしてオプションオブジェクトの一意の方法を設定し定義します。タイプアクション<TOptions>、その実装型ConfigureOptions用ので<TOptions>、直接作用を介して、対応するオブジェクト<TOptions>オブジェクトとデリゲートオブジェクトConfigureOptions <TOptions>オブジェクトの役割の定義から分かるように作成します。
1:パブリッククラスOptionsManager <TOptions>:IOptions <TOptions>ここでTOptions:クラス、新しいです()
2:{
3:公共OptionsManager(IEnumerableを<IConfigureOptions <TOptions >>セットアップ)。
4:パブリック仮想TOptions値{取得します。}
5:}
6:
クラス:7:TOptions <TOptions中>パブリック・インタフェースIConfigureOptions
8:{
9:無効設定(TOptionsオプション)。
10:}
11:
12:パブリッククラスConfigureOptions <TOptions>:IConfigureOptions <TOptions> TOptions:クラス、新しいです()
13:{
14:公共のアクション<TOptions>アクション{取得します。プライベートセット; }
15:公共ConfigureOptions(アクション<TOptions>アクション)
16:{
17:this.Action =アクション。
18:}
19:公共の無効設定(TOptionsオプション)
20:{
21:this.Action(オプション)。
22:}
23:}
オブジェクトを作成するためのオプションがOptionsManager <TOptions>タイプのValueプロパティに反映しました。プロパティの実現は非常に簡単です、それは最初の空のオプションをオブジェクトを作成し、返す前に、それはConfigureOptionsを初期化するために、その指定した時間を提出します(オプションタイプはデフォルトの引数なしのコンストラクタを持たなければなりません)デフォルト引数なしのコンストラクタを呼び出します< TOptions>は一つのオブジェクトを処理しました。疑いの余地はBindメソッドは確かに全体のプロセスに<TOptions>オブジェクトによるConfigureOptions参加、特定の性質であり、約別の拡張メソッドの構成を達成するために呼び出す、があります。
第三に、拡張メソッドの設定
ServiceCollectionモードのオプションが2つのしか拡張メソッド(AddOptionsと設定<TOptions>)が含まれ、前者は<TOptions> / OptionsManager <TOptions>今度はそれサービス登録の種類作らServiceCollection、上に登録されたIOptionsに役立つのだろうか?
1:パブリック静的IServiceCollection設定<TOptions>(このIServiceCollectionサービス、IConfiguration設定)TOptions:クラス
2:{
3:services.AddSingletonを返す<IConfigureOptions <TOptions >>(新しいConfigureFromConfigurationOptions <TOptions>(設定));
4:}
5:
6:パブリッククラスConfigureFromConfigurationOptions <TOptions>:ConfigureOptions <TOptions>ここでTOptions:クラス
7: {
8:公共ConfigureFromConfigurationOptions(IConfiguration設定)
9:ベース(オプション=> config.Bind(オプション))
10:{}
11:}
我々は、指定されたオブジェクトがConfigureFromConfigurationOptions構成オブジェクトを作成し、サービスタイプIConfigureOptions <TOptions> ServiceCollectionに登録され、使用される使用する拡張メソッドServiceCollection設定<TOptions>を呼び出すと、上記のコード断片から分かるようにシングルトンのためのライフサイクルモデル。ConfigureFromConfigurationOptionsの種類については、後継者のそれはConfigureOptionsある<TOptions>タイプは、前述した、オブジェクトを作成する拡張メソッドBind設定オブジェクトと、最終的な構成バインディングを呼び出すことによってアクション<TOptions>デリゲートオブジェクトを指定しました。
第四に、オブジェクトのオプションを作成します
コアにServiceCollectionに2つのサービスを登録するオプションプログラミングモードの後ろ、サービスインタフェースを対応するこれら2つのサービスは、後に、IOptions <TOptions>とIConfigureOptions <TOptions>、前者直接結合オプション究極オブジェクト構成データでありますオプションのオブジェクトその前の実施例対応する初期化に戻されます。2つのサービスが指定ServiceCollectionに拡張メソッドのAddOptionsおよび構成方法によって登録され、サービスの実際のタイプはConfigureOptions <TOptions>に由来するOptionsManager <TOptions>とConfigureFromConfigurationOptions <TOptions>です。同図に示すモデルとその間に関与するこれらのインタフェースUML /オプションの種類の関係を反映しています。