2009-04-11 6 views
13

.NET 2.0およびそれ以降の構成システムは、非常に強力で拡張性があります。変更する必要がない限り、すべてがファイルシステムのXMLファイルに由来します。データベースから.NET構成を読み込みます。

私の必要条件として、私のアプリケーションが私の手の届かないところにある管理された環境で動作するため、私はファイルを変更できませんが、SQL Serverデータベースを変更できます。

私はSQLテーブルに設定ファイルやセクションを保存することを検討していますが、どうすれば.NET 2.0設定システムをこれに結び付けることができますか?

ファイルシステム内の*。configファイルからではなく、SQLデータベース内のテーブルから構成セクションを読み取る「カスタム構成プロバイダ」を作成する方法はありますか?

自分でカスタムのConfigurationSectionやConfigurationElement、あるいはカスタム設定を作成してみましたが、ファイルシステムのconfig-systemをそれほど拡張することはできません私が好きなように、私はデータベーステーブルから私のXMLフラグメントを読むことができません.....

私は何が欠けていますか?誰かがこれをすでにやっていて、説明/共有するのを気にしていますか?

ありがとうございます! Marc

PS:設定XMLを文字列に読み込み、それを適切なものに逆シリアル化してみました。 ServiceModelConfigSection - これはうまくいきません。残念なことに、ConfigSectionの基本クラスはXMLシリアライズ可能なメソッドを実装していないためです(YIKES !!!)

+0

ただし、SQL接続の設定情報を設定する場所が問題になることはありませんか? DBに接続したら、必要な設定を読み込むことができます。 App.Configはルックアップテーブルではありません。 – sipwiz

+0

はい - 私が達成しようとしているのは、データベース内からWCFサービスを設定することです。これらのWCF設定ファイルは大規模かつ複雑です - そして、私は本当にすべてのことを原子の束縛に分解したくありません - >私はデータベースからconfig XMLを読んでそれを適用したいと思っています。 –

+0

ああ、それは理にかなっている、私はなぜデータベースからのWCFの設定は便利だろうと思う。私はあなたが正しいと思うし、ファイルの代わりにXMLのストリームまたはブロックとしてApp.Configを読み込むための方法がなければならない。 – sipwiz

答えて

5

There'sあなたが話している何をやっについて語ってここに記事こと:まとめると

http://www.wrox.com/WileyCDA/Section/Redirecting-Configuration-with-a-Custom-Provider.id-291932.html

、彼らが何をすべきかは、通常、.configファイルを暗号化するために使用されProtectedConfigurationProvider、の派生版を作成することです。 Decryptメソッドでは、構成情報を解読する代わりに、データベースから取得します。

+0

+1 - ありがとう、非常に面白い! "ProtectedConfigurationProvider"をまだ基本クラスとして理解することはできませんが、試してみましょう! –

+2

こんにちはKeltex - それは主に動作しますが、私の意見ではかなりひどいHACKです。あまりにも悪いことは、設定プロバイダを.NET構成システムに直接プラグインする「適切な」公式な方法がないことです... .. –

+0

@marc_s私は同意します。しかし、それは回避策です。 – Keltex

1

あなたはあなたのニーズに応じてCinchoo frameworkを試すことができます。

それはここで

namespace HelloWorld 
{ 
    #region NameSpaces 

    using System; 
    using Cinchoo.Core.Configuration; 

    #endregion NameSpaces 

    [ChoConfigurationSection("sample")] 
    public class SampleConfigSection : ChoConfigurableObject 
    { 
     [ChoPropertyInfo("name", DefaultValue="Mark")] 
     public string Name; 

     [ChoPropertyInfo("message", DefaultValue="Hello World!")] 
     public string Message; 
    } 

    static void Main(string[] args) 
    { 
     SampleConfigSection sampleConfigSection = new SampleConfigSection(); 
     Console.WriteLine(sampleConfigSection.ToString()); 
    } 

} 

非常に最初の時間をCinchooフレームワークを使用して、構成オブジェクトを定義して使用するための簡単な方法でファイルに構成エントリを読み取り、書き込み、レジストリ、INI、データベースなどをサポートしていますアプリケーションを実行すると、Cinchooフレームワークは以下のように自動的に設定セクションを生成します。その後、構成ソースまたはコードのいずれかを使用してそれらを制御できます。

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <section name="sample" type="Cinchoo.Core.Configuration.ChoNameValueSectionHandler, Cinchoo.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b7dacd80ff3e33de" /> 
    </configSections> 
    <sample> 
    <add key="name" value="Mark" /> 
    <add key="message" value="Hello World!" /> 
    </sample> 
</configuration> 

3

web.configと設定セクションを読んでいるときに、.NETで使用するのと同じxml解析を使用できます。

ここにはsample codeがあります。

xmlで表現したいクラスです。

文字列(またはデータベース)からXMLを使用してこのConfigurationSectionをインスタンス化する方法は次のとおりです。これは、上記のブログ記事でリンクされていたGitHubのテストから取得されたものです。

[TestMethod] 
public void Can_build_configuration_with_default_value_set() 
{ 
    var result = _configurationSectionBuilder 
     .BuildSection<TestConfiguration>("<config requiredProperty=\"required\" optionalProperty=\"setValue\"></config>"); 

    Assert.AreEqual("setValue", result.OptionalProperty); 
} 

このアプローチでは、System.Configuration名前空間を使用してすべての.NETリフトを取得します。

+1

ニース!これは私のためにうまくいった。唯一の問題は、私のXMLに先行するCRLF /空白がないことを確認する必要があることでした。このようなプライベートCLRメソッドに頼ることは危険だと言う人もいますが、私がリファクタリングしようとしているコードよりもはるかにスケッチではありません。これは、私が主な問題を攻撃している間に、このようなもののいくつかを支える大きな足場を作ります。再度、感謝します! – killthrush

関連する問題