むしろ古い質問が、ちょうどこれに対する解決策で遊ん:あなたはこのようなセクションを得ることができたより
protected override void DeserializeElement(XmlReader reader, bool serializeCollectionKey)
{
XmlDocument document = new XmlDocument();
document.LoadXml(reader.ReadOuterXml());
MyProperty = document.DocumentElement.HasAttribute("MyProperty")
? document.DocumentElement.Attributes[ "MyProperty" ].Value
: string.Empty;
}
。これはSimon Mourierのアプローチと似ていますが(これはいくつかの点でよりうまくいく - よりハッキリではありませんが)、System.Configuration.ConfigurationManager.GetSection()
を呼び出すコードは、静的メソッドを使用するように変更しなくても機能するため、全体的にコードの変更が少なくなります。
最初の基本的な注意点は、これがネストされたセクションで機能するかどうかはわかりませんが、私はほとんどそれがないと確信しています。ほとんどの主な注意点は、configセクションのクラスを変更する必要があるため、ソースを持つカスタムセクションでのみ使用できることです(変更が許可されています)。
第2およびMAIN CAVEAT私はちょうどこれを使って遊んでいるのですが、私はそれを開発で使っていないし、生産でもないし、単にこのような基本的な機能を自分のコードに塗りつぶすだけで、ノックオン効果が現れないかもしれない私の例。 自己責任において使用してください。
EDITを(と言った、私が起こっている他のconfigセクションの負荷となるようUmbracoサイトでそれをテストしていて、彼らはまだすべての作業なので、私はそれがありませんすぐにひどい影響があると思います):これは元の質問ごとに3.5ではなく.NET 4です。その違いが違いを生むかどうかは分かりません。
コードは非常に単純ですが、DeserializeSection
をオーバーライドして、データベースから読み込むXMLリーダーを使用してください。
public class TestSettings : ConfigurationSection
{
protected override void DeserializeSection(System.Xml.XmlReader reader)
{
using (DbConnection conn = /* Get an open database connection from whatever provider you are using */)
{
DbCommand cmd = conn.CreateCommand();
cmd.CommandText = "select ConfigFileContent from Configuration where ConfigFileName = @ConfigFileName";
DbParameter p = cmd.CreateParameter();
p.ParameterName = "@ConfigFileName";
p.Value = "TestSettings.config";
cmd.Parameters.Add(p);
String xml = (String)cmd.ExecuteScalar();
using(System.IO.StringReader sr = new System.IO.StringReader(xml))
using (System.Xml.XmlReader xr = System.Xml.XmlReader.Create(sr))
{
base.DeserializeSection(xr);
}
}
}
// Below is all your normal existing section code
[ConfigurationProperty("General")]
public GeneralElement General { get { return (GeneralElement)base["General"]; } }
[ConfigurationProperty("UI")]
public UIElement UI { get { return (UIElement)base["UI"]; } }
...
...
}
私はあなたがweb.config
が必要ですので、それを動作させるために、ASP.Netを使用していますが、その後ねえ、私はとにかく、接続文字列のどこかで必要とするか、または私がデータベースに接続するつもりはありませんすべて。
カスタムセクションは通常のように<configSections/>
に定義する必要があります。この作業を行う上での鍵は、通常の設定の代わりに空の要素を置くことです。すなわち<TestSettings configSource="..."/>
またはインライン設定の代わりに、単に<TestSettings/>
を入れ、構成マネージャは、その後、すべてのセクションをロードし、既存の<TestSettings/>
要素を参照してください、そして、それをデシリアライズ、それはあなたのオーバーライドをヒットし、データベースからXMLをロードし、その時点でます代わりに。
:デシリアライズでは、文書全体ではなく、文書の断片(ノードが既にノードにあるときに呼び出されることが予想される)が必要であるため、セクションが別々のファイルに格納されている場合は、最初に<?xml ?>
宣言、またはExpected to find an element
が得られます。
私は**これを解決するために**愛しています - 私はしばらくの間、多くの成功なしに、残念ながら研究してきました.... –
私は私が一人ではないことを嬉しく思います。 –
アプリケーションコードによって構成ファイルの場所を変更できないように思われるため、この回答はわかりません。しかし、私はこのシナリオで構成ファイルをオーバーロードせず、DBからデータを取得する独自の構成リーダーを作成します。 – akonsu