標準ロギング、NHibernate などの構成ブロックがあり、app.configそれらを共通の XML ファイルに抽出して、すべてのアプリケーションのファイルに参照として含めることができるようにしたいと考えていapp.configます。
これは可能ですか?
標準ロギング、NHibernate などの構成ブロックがあり、app.configそれらを共通の XML ファイルに抽出して、すべてのアプリケーションのファイルに参照として含めることができるようにしたいと考えていapp.configます。
これは可能ですか?
はい、configSource構成ブロックの属性を使用できます。文書化されていませんが、すべての構成ブロックにこの属性があります。
この記事の一番下、付録 B を参照してください。以下の関連セクションも貼り付けました。
付録 B: 外部構成ファイルを含む
.NET 2.0 の構成機能にはさまざまな優れた点がありますが、欠点が 1 つあります。複数の環境にまたがる単一のプロジェクトで作業する場合、構成の管理は悪夢になる可能性があります。私の現在の仕事では、複数の環境 (つまり、開発、テスト、ステージング、および実稼働) の構成ファイルの複数のバージョンを管理するプロセスには
.config、手動のマージ プロセスを使用して、変更がいずれかの環境にデプロイされるたびに手動でファイルを比較することが含まれます。より良い方法を見つけるために何ヶ月も費やし、最終的に見つけました。Microsoft が非常に有名な「文書化されていない」機能 (この場合は、文書化が不十分な機能) の 1 つを入力してください。configSource. 私がこの小さな宝石に出会ったのは、素晴らしい小さなツールである Reflector を使用して .NET 2.0 構成のソース コードを掘り下げていたときだけでした。各構成セクションは、.NET 構成クラスによって解析およびロードされるときに、
SectionInformationオブジェクトが割り当てられます。このSectionInformationオブジェクトには、構成セクションに関するメタ情報が含まれており、子構成ファイル (ASP.NET) で定義されたときにセクションが互いにオーバーライドする方法をある程度管理できます。ここでは、SectionInformation が提供するものの大半を無視し、ConfigSourceプロパティを保存します。configSourceany のルート要素に属性を追加すること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 環境の相対親パスにファイルを保存する際のセキュリティ上の懸念に関するものだと思います。他に注意すべきことは、この
<appSettings>セクションにはconfigSourcefile. セクションでconfigSource ではなく file 属性を使用すると<appSettings>、ルート.configファイルと参照ファイルの両方で設定を定義できます。ルート.configファイルの設定は、同じキーを持つ何かを追加するだけで、参照ファイルでオーバーライドされる場合もあります。残念ながら、ファイル属性はセクションでのみ使用でき<appSettings>、構成フレームワークには組み込まれていません。独自の構成セクションで同様の属性を実装することが可能です。これについては、いくつかの前提条件の記事の後で、高度な構成トピックの今後の記事で説明します;)。