web-dev-qa-db-ja.com

app.configでXMLインクルードまたは構成参照を使用して、他の構成ファイルの設定を含める

私のapp.configには、標準のロギング、NHibernateなどの構成ブロックがあり、すべてのアプリケーションのapp.configファイルで参照として含めることができる共通のXMLファイルにそれらを抽出したい。

これは可能ですか?

37
TheSoftwareJedi

はい、構成ブロックのconfigSource属性を使用できます。文書化されていませんが、すべての構成ブロックにこの属性があります。

この記事 の下部にある付録Bを参照してください。以下の関連セクションも貼り付けました。

付録B:外部構成ファイルを含む

.NET 2.0の構成機能にはすばらしい点がたくさんありますが、欠点が1つあります。複数の環境にわたって単一のプロジェクトで作業する場合、構成の管理は悪夢になる可能性があります。現在のジョブで、複数の環境(つまり、開発、テスト、ステージング、本番)の構成ファイルの複数のバージョンを管理するプロセスには、変更が1つの環境または別の環境にデプロイされるたびに、.configファイルの手動比較が含まれます。手動のマージプロセス。私は数か月かけてより良い方法を見つけようとしましたが、最終的にはそれを見つけました。 Microsoftが非常に有名なconfigSourceのような、機能性が非常に高い「文書化されていない」機能、またはこの場合は文書化が不十分な機能の1つを入力してください。この小さな宝石に出くわしたのは、素晴らしい小さなツールであるReflectorで.NET 2.0構成のソースコードを調べていたときだけでした。

各構成セクションは、.NET構成クラスによって解析およびロードされると、SectionInformationオブジェクトに割り当てられます。 SectionInformationオブジェクトには、構成セクションに関するメタ情報が含まれており、子構成ファイル(ASP.NET)で定義されている場合、セクションがお互いをオーバーライドする方法を管理できます。ここでは、SectionInformationが提供する機能の大部分を無視して、ConfigSourceプロパティを保存します。 configSource属性をConfigurationSectionのルート要素に追加することで、構成設定のロード元となる代替の外部ソースを指定できます。

<!-- SomeProgram.exe.config -->
<configuration>
  <connectionStrings configSource="externalConfig/connectionStrings.config"/>
</configuration>

<!-- externalConfig/connectionStrings.config -->
<connectionStrings>
  <add name="conn" connectionString="blahblah" />
</connectionStrings>

上記の構成ファイルでは、<connectionStrings>セクションはexternalConfig/connectionStrings.configというファイルから提供されています。アプリケーションのすべての接続文字列が、指定されたファイルから読み込まれます。接続文字列が外部リソースから読み込まれたので、各環境の同じ場所にconnectionStrings.configファイルを作成することは比較的簡単です。したがって、externalConfig/パスのconnectionStrings.config部分。ここでの美しさは、接続文字列を環境ごとに適切に一度定義できることです。設定ファイルが不適切にマージされたり、まったくマージされなかったりするデプロイメント中に、これらの設定を誤って上書きすることを心配する必要はありません。これは、アプリケーションの変更を本番環境にデプロイするときに非常に役立ちます。本番環境では、正しいデータベース接続文字列が存在することが重要です。 configSource属性を使用する欠点は、すべての構成設定を外部ファイルに配置する必要があることです。継承や上書きは不可能であり、場合によっては役に立たなくなります。 configSource属性で使用されるすべての外部構成ファイルも、メインの.configファイルへの相対子パスに存在する必要があります。これは、Web環境の相対親パスにファイルを保存する場合のセキュリティ上の問題に関するものだと思います。

もう1つ注意すべき点は、<appSettings>セクションには、ファイルと呼ばれるconfigSourceを使用するよりも優れた方法があることです。 <appSettings>セクションでconfigSourceではなくfile属性を使用する場合、ルート.configファイルと参照ファイルの両方で設定を定義できます。ルート.configファイルからの設定は、同じキーを持つ何かを追加するだけで、参照ファイルでオーバーライドされる場合もあります。残念ながら、ファイル属性は<appSettings>セクションでのみ使用でき、構成フレームワークには組み込まれていません。独自の構成セクションに同様の属性を実装することが可能です。これについては、いくつかの前提条件となる分割払いの後、高度な構成トピックの今後の分割払いで説明します。

73
TheSoftwareJedi