専用、カスタムは良い響き(弐)

専用、カスタムは良い響きの続き。
DB接続用の設定
<twSettings>
<dbResources>
<dbResource id="KOCCHI_DB"
connectionString="Data Source=...Initial Catalogue=..."
dbType="SQLServer"
/>
<dbResource id="SOCCHI_DB"
connectionString="Data Source=...Initial Catalogue=..."
dbType="SQLServer"
/>
</dbResources>
</twSettings>
を読み込む為のConfigクラスを作る。Config系のクラスを実装するには、System.Configration.dllへの参照が必要になる。これを忘れると、実装しても、ビルドエラーの嵐に見舞われる。
(1)dbResourceタグ用クラスを作る。
タグの中に別のタグを保持する訳ではないので、ConfigurationElementクラスを継承して実装する。
using System;
using System.Configuration;

namespace TawamureDays.Config {

/// <summary>
/// TawamureDays dbResourceタグ用クラス
/// </summary>
public sealed class DbResourceConfigElement : ConfigurationElement {

#region 定数

/// <summary>属性:id</summary>
private const string ATTR_ID = "id";

/// <summary>属性:接続文字列(connectionString)</summary>
private const string ATTR_CONN_STR = "connectionString";

/// <summary>属性:DBMSのタイプ(dbType)</summary>
/// <remarks>enum(DbFactoryName)を参照</remarks>
private const string ATTR_DB_TYPE = "dbType";

#endregion

#region コンストラクタ

/// <summary>
/// コンストラクタ
/// </summary>
public DbResourceConfigElement() : base() {
}

#endregion

#region プロパティ

/// <summary>
/// 接続IDを取得/設定します。
/// </summary>
/// <remarks>必須</remarks>
[ConfigurationProperty(ATTR_ID, IsRequired=true, DefaultValue="unknown-id", IsKey=true)]
public string Id {
get {return this[ATTR_ID];}
set {this[ATTR_ID] = value;}
}

/// <summary>
/// 接続文字列を取得/設定します。<br/>
/// </summary>
/// <remarks>必須</remarks>
[ConfigurationProperty(ATTR_CONN_STR, IsRequired=true, DefaultValue="unknown-connection")]
public string ConnectionString {
get {return this[ATTR_CONN_STR];}
set {this[ATTR_CONN_STR] = value;}
}

/// <summary>
/// DB接続タイプを取得/設定します。
/// </summary>
/// <remarks>必須</remarks>
[ConfigurationProperty(ATTR_DB_TYPE, IsRequired=true, DefaultValue="unknown-type")]
public string DbType {
get {return this[ATTR_DB_TYPE];}
set {this[ATTR_DB_TYPE] = value;}
}

#endregion
}
}
誤字入力によるエラーを防ぐ為に定数化している。constなのは、constじゃないと属性に使えないから。

(2)dbResourcesタグ用クラスを作る。
タグ内にdbResourceタグを不特定多数持たせる事になるので、ConfigurationElementCollectionクラスを継承して実装する。
using System;
using System.Configuration;

namespace TawamureDays.Config {

/// <summary>
/// TawamureDays dbResourcesタグ用クラス
/// </summary>
[ConfigurationCollection(typeof(DbResourceConfigElement))]
public sealed class DbResourceConfigCollection : ConfigurationElementCollection {

#region 内部定数

/// <summary>要素名</summary>
private static readonly string ELEMENT_NAME = "dbResource";

#endregion

#region コンストラクタ

/// <summary>
/// コンストラクタ
/// </summary>
public DbResourceConfigCollection() {
}

#endregion

#region ConfigurationElementCollection メンバー

/// <summary>
/// ConfigurationElementCollection の型を取得します。
/// </summary>
public override ConfigurationElementCollectionType CollectionType {
get {return ConfigurationElementCollectionType.BasicMap;}
}

/// <summary>
/// 指定されたインデックスのDbConnectionElementオブジェクトを取得/設定します。
/// </summary>
/// <param name="index">インデックス</param>
/// <returns>DbConnectionElementオブジェクト</returns>
public DbResourceConfigElement this[int index] {
get {return (DbResourceConfigElement)this.BaseGet(index);}
set {
if (this.BaseGet(index) != null) {
this.BaseRemoveAt(index);
}
this.BaseAdd(index, value);
}
}

/// <summary>
/// 指定されたIDから、DbConnectionElementオブジェクトを取得します。
/// </summary>
/// <param name="id">ID</param>
/// <returns>DbConnectionElementオブジェクト</returns>
public new DbResourceConfigElement this[string id] {
get{return (DbResourceConfigElement)this.BaseGet(id);}
}

/// <summary>
/// 新しい ConfigurationElement を作成します。
/// </summary>
/// <returns>ConfigurationElementオブジェクト</returns>
protected override ConfigurationElement CreateNewElement() {
return new DbResourceConfigElement();
}

/// <summary>
/// 指定した構成要素の要素キーを取得します。
/// </summary>
/// <param name="element">構成要素オブジェクト</param>
/// <returns>要素キー</returns>
protected override object GetElementKey(ConfigurationElement element) {
return ((DbResourceConfigElement)element).Id;
}

/// <summary>
/// 構成ファイル内のこの要素のコレクションを識別するために使用する名前を取得します。
/// </summary>
protected override string ElementName {
get {return DbResourceConfigCollection.ELEMENT_NAME;}
}

#endregion
}
}


(3)twSettingsタグ(セクションのルート)用クラスを作る。
セクションのルートになるので、ConfigurationSectionクラスを継承して実装する。このクラスを通して設定を取得することになる。
using System;
using System.Configuration;

namespace TawamureDays.Config {

/// <summary>
/// コンフィグセクション用クラス
/// </summary>
public class TawamureConfigSection : ConfigurationSection {

#region 定数

/// <summary>要素名:メッセージリソース(msgresources)</summary>
private const string ELEM_DB_RESOURCE = "dbResources";

#endregion

#region コンストラクタ

/// <summary>
/// コンストラクタ
/// </summary>
public TawamureConfigSection() {
}

#endregion

#region プロパティ

/// <summary>
/// DB接続リソース(dbResources)コレクションを取得します。
/// </summary>
[ConfigurationProperty(ELEM_DB_RESOURCE)]
public DbResourceConfigCollection DbResources {
get {return (DbResourceConfigCollection)this[ELEM_DB_RESOURCE];}
}

#endregion

}
}

実際に設定してみる。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="tawamureSection"
type="TawamureDays.Config.TawamureConfigSection,TawamureDays"
/>
</configSections>
<tawamureSection>
<dbResources>
<dbResource id="SOCCHI_DB" dbType="SQLServer"
connectionString="DataSource"
/>
</dbResources>
</tawamureSection>
</configuration>

取得方法は、こんな感じ
var configSection =
ConfigurationManager.
GetSection("tawamureSection") as
TawamureConfigSection;

var drResConfig =
configSection.DbResources["SOCCHI_DB"] as
DbResourceConfigElement;

これでDBMSの種類も一緒に取得できる。まあ、ここからもそれはそれで大変なんだけど。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m