.Net アプリケーションでは、VS によって生成されたプロジェクトに App.config や Web.config などのファイルが含まれることがよくあります。このファイルは、アプリケーション構成ファイルと呼ばれるものです。このファイルには、データベース接続、認証モードなど、アプリケーションに関連するいくつかの情報が記述されています。プログラムでは、ConfigurationManager の ConnectionStrings プロパティを使用して、構成ファイル内のデータベース接続文字列情報を簡単に取得できます。
ただし、場合によっては、デフォルト構成を使用するだけでなく、それを拡張してカスタム要素を追加する必要があります。たとえば、プログラムの開始時にクラスを動的にロードして初期化する必要がある場合がありますが、このクラスまたは初期化データはプログラム設計時には不明です。誰もがこのような問題に遭遇したことがあると思いますので、ここではあまり説明しません。最善の方法は、変更する可能性のあるものを確実に構成ファイルに書き込むことです。製品がオンラインになるときに VS を開いて変更するのに 30 秒かかるのではなく、構成ファイルを変更するだけで済みます。コード。
いくつかのカスタム要素を構成ファイルに追加するのは簡単で、必要な手順は次の 2 つだけです。
1. <configSections>ノードに、定義したいノード名とそのノードを処理するための設定セクションハンドラを登録します。コードは次のとおりです。
1 <configSections>2 <section name="dbFactory" type="DbFactory.Configuration.DbFactorySection,DbFactory.Configuration"/>3 </configSections>
2. カスタマイズしたノードを適切な場所に追加します。コードは次のとおりです。
1 <configSections> 2 <section name="dbFactory" type="DbFactory.Configuration.DbFactorySection,DbFactory.Configuration"/> 3 </configSections> 4 <dbFactory> 5 <default Factory="sql"></default> 6 <factorys> 7 <add name="sql" Assembly="Hello.Data" class="SqlDbFactory" /> 8 <add name="oracle" Assembly="Hello.Data" class="OracleDbFactory" /> 9 </工場>10 </dbFactory>
カスタム ノードが追加されましたが、プログラム内でこの構成情報を取得するにはどうすればよいでしょうか? System の下でいくつかのクラスを使用している場合は、XML の操作に精通している人も多いと思います。まさにその通りです、師匠は本当に師匠です。しかし、この方法で実装されれば、私がこのブログ記事を書く必要はまったくありません。
.Net フレームワークには、構成ファイルの操作を簡素化するために多くの構成 API が実装されています。最初のステップでは、カスタマイズされたノード情報の読み取りと書き込みに使用される構成セクション ハンドラーについて説明しました。では、構成セクション ハンドラーを実装するにはどうすればよいでしょうか?まず、関連するクラスと概念を見てみましょう。
ConfigurationSection: カスタム ノードは、カスタマイズされた処理とカスタム構成セクションへのプログラムによるアクセスを提供するために、このクラスを継承する必要があります。
ConfigurationElement: 構成ファイル内の要素を表します。
ConfigurationElementCollection: 子要素のコレクションを含む構成要素を表します。
これらのクラスを使用すると、構成ファイルには 2 種類の構成要素があると要約できます。
まず、単一の構成要素は、ConfigurationElement を継承する要素であり、子要素は含まれません。
次に、コレクション構成要素は、子要素のコレクションを含む ConfigurationElementCollection から継承された要素です。
多くの場合、概念は比較的抽象的です。これらのことを理解するには、上で挙げた例に基づいて詳細に説明する必要があります。
<dbFactory> 構成セクションには、<default> と <factorys> という 2 つの要素があり、<factorys> 要素には 2 つのサブ要素が含まれています。したがって、ここで <default> は単一の構成要素であり、<factorys> はコレクション構成要素です。これらの要素にそれぞれ対応するクラスとそのプロパティを実装する必要があります。
<default> 要素: 単一タイプの要素であるため、ConfigurationElement を継承します。この要素にはファクトリー属性があるので、クラス内でそれに応じて定義します。コードは次のとおりです。
コード
public class DefaultElement: ConfigurationElement { [ConfigurationProperty("factory")] public string Factory { get { return this["factory"] を文字列として返す } set { this["factory"] = 値;
注: プロパティ定義の上にプロパティの ConfigurationProperty 属性を登録する必要があります。
<factorys> 子要素:
コード
public class FactoryElement : ConfigurationElement { [ConfigurationProperty( "name" )] public string Name { get { return this["name"] } set { this["name"] = value; } )] public string Assembly { get { return this["assembly"] を文字列として; } set { this["assembly"] = 値; } } [ConfigurationProperty("class")] public string Class { get { return this[" class"] を文字列として; } set { this["class"] = 値; } } }
<factorys> 要素はコレクション要素であり、ConfigurationElementCollection を継承します。
コード
public class FactoryElements : ConfigurationElementCollection { protected override ConfigurationElement CreateNewElement() { return new FactoryElement(); } protected override object GetElementKey( ConfigurationElement element ) { return ((FactoryElement)element).Name } public FactoryElement this[string name] { get { BaseGet( name ) を FactoryElement として返します。
ConfigurationElementCollection クラスは抽象クラスであるため、その CreateNewElement メソッドと GetElementKey メソッドを明示的に実装する必要があります。
<dbFactory> ノード、ConfigurationSection から継承
コード
public class DbFactorySection : ConfigurationSection { [ConfigurationProperty("default")] public DefaultElement DefaultFactory { get { return this["default"] として } set { this["default"] = value; } [ConfigurationProperty( "factorys"; )] public FactoryElements Factorys { get { return this["factorys"] を FactoryElements } set { this["factorys"] = 値;
構成セクション ハンドラーが最終的に完成しました。これらの 4 つのクラスを同じプロジェクト ディレクトリに配置し、DLL にコンパイルします。構成情報を取得する必要がある場合は、この DLL を参照し、 DbFactorySection セクション = ConfigurationManager.GetSection( "dbFactory" ) を使用してください。