App.Configおよびカスタム構成セクション

この記事はささいなことのように思えるかもしれませんが、有用なものが忘れられることがあり、外国語で本を読むのが面倒です。 そのため、Googleに目を向け、.netアプリケーションでapp.configファイルの構成セクションハンドラーを作成するプロセスの適切な説明を見つけて翻訳し、コメント(斜体)とコメントで補足して公開することにしました。

皆さんの多くは、アプリケーションの初期化または構成データを保存するためにApp.Config構成ファイルを使用しなければならなかったと確信しています。 また、設定を保存するために、このファイルに独自の構造を作成したいと多くの人が思っていたと確信しています。 しかし、最終的には、<appSettings>セクションの組み込み機能を使用し、ビューコンストラクトを使用して値を取得する必要がありました。

ConfigurationManager.AppSettings["MyKey"] 


まあ、私は長い間、ConfigurationSectionクラスの機能を使用して、独自の形式で定義されたデータを記述およびロードする方法を見つけ出したいと思っていました。 数時間の実験とグーグルの後、構成ファイルにデータ構造を作成し、アプリケーションで使用することができました。

したがって、App.Configファイルからデータ構造をロードするには、次のクラスが必要です。
  1. ConfigurationSection-このオブジェクトはユーザーセクションを返します。
  2. ConfigurationElementCollection-これは、実際にはユーザーセクションで定義する要素のコレクションです。
  3. ConfigurationElement-これは、定義するエンティティを記述する要素自体です。



最初に行う必要があるのは、app.Configファイルをアプリケーションに追加することです(もちろん、既にそうしていない場合)。 その後、このファイルを開き、次のコードを<configuration>タグの間にコピーします。

 <configSections> <!-- name = ,          . type =   .   :   -      +   ,  ,    . --> <section name="StartupFolders" type="ConfigSectionTester.StartupFoldersConfigSection, ConfigSectionTester"/> </configSections> 


注:このセクションは、構成ファイルの先頭に配置する必要があります。 <configuration>タグの直後。そうでない場合、構成初期化エラーが発生します。

次に、独自のデータモデルを実装する独自のセクションを作成します。

 <StartupFolders> <Folders> <add folderType="A" path="c:\foo" /> <add folderType="B" path="C:\foo1" /> </Folders> </StartupFolders> 


注:この例のaddコマンドでノードを追加するのが嫌な場合は、次のコードを使用していつでも独自のプレフィックスを作成できます。
 [ConfigurationCollection( typeof( FolderElement ) ), AddItemName = "Folder"] public class FoldersCollection : ConfigurationElementCollection { 

データ構造内の要素のコレクションを定義するとき。 次に、構成ファイルに次のように記述できます。
 <StartupFolders> <Folders> <Folder folderType="A" path="c:\foo" /> <Folder folderType="B" path="C:\foo1" /> </Folders> </StartupFolders> 



構成ファイルの変更を完了し、アプリケーションとの相互作用の整理に進みます。

まず、ConfigurationSectionから継承クラスを作成します。これにより、プログラムの実行中にConfigurationManagerを介して構成ファイル内のセクションとやり取りできるようになります。

 public class StartupFoldersConfigSection : ConfigurationSection { [ConfigurationProperty( "Folders" )] public FoldersCollection FolderItems { get { return ( (FoldersCollection)( base[ "Folders" ] ) ); } } } 

FolderItemsプロパティをデータ構造のルートノードにマップするには、ConfigurationProperty属性(「Folders」)が必要です。

FoldersCollectionクラスはConfigurationElementCollectionの子孫であり、app.configで説明されている要素のコレクションとの相互作用を提供します。 クラスは次のように定義されます。

 [ConfigurationCollection( typeof( FolderElement ) )] public class FoldersCollection : ConfigurationElementCollection { protected override ConfigurationElement CreateNewElement() { return new FolderElement(); } protected override object GetElementKey( ConfigurationElement element ) { return ( (FolderElement)( element ) ).FolderType; } public FolderElement this[int idx ] { get{return (FolderElement) BaseGet(idx); } } } 


最後に、ConfigurationElementを作成する必要があります。ConfigurationElementは、構成ファイルで定義された最終データに接続するクラスです。

 public class FolderElement : ConfigurationElement { [ConfigurationProperty("folderType", DefaultValue="", IsKey=true, IsRequired=true)] public string FolderType { get {return ((string) (base["folderType"]));} set{base["folderType"] = value; } } [ConfigurationProperty( "path", DefaultValue = "", IsKey = false, IsRequired = false )] public string Path { get{return ( (string)( base[ "path" ] ) ); } set{base[ "path" ] = value; } } } 


構成ファイルでxml属性の名前を関連付けるには、ConfigurationProperty属性( "folderType")が必要です。 DefaultValue = ""、IsKey = true、IsRequired = trueなどの他の属性パラメーターは、プロパティに適用されるさまざまなオプションのみを決定します。

注:作成者は、FolderTypeプロパティのセッターを使用する標準的な方法では機能しないことを黙っています。 通常、構成ファイルは読み取り専用です。 構成ファイルへの書き込みを可能にするには、たとえば次のようにする必要があります。

 Configuration cfg = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); StartupFoldersConfigSection section = (StartupFoldersConfigSection)cfg.Section["StartupFolders"]; if ( section != null ) { System.Diagnostics.Debug.WriteLine( section.FolderItems[0].FolderType ); System.Diagnostics.Debug.WriteLine( section.FolderItems[0].Path ); section.FolderItems[0].Path = "C:\\Nanook"; cfg.Save(); //        <exename>.vshost.exe.config     . } 


したがって、app.config構成ファイルにユーザーデータ構造を保存する機能を提供する必要なデータとクラスがすべてあります。
このアプローチは次のように使用できます。

 StartupFoldersConfigSection section = (StartupFoldersConfigSection)ConfigurationManager.GetSection( "StartupFolders" ); if ( section != null ) { System.Diagnostics.Debug.WriteLine( section.FolderItems[ 0 ].FolderType ); System.Diagnostics.Debug.WriteLine( section.FolderItems[ 0 ].Path ); } 

同時に、接続された名前空間のリストにSystem.Configurationを登録することを忘れないでください。

投稿者: Derik Whittaker

Source: https://habr.com/ru/post/J128517/


All Articles