2009-04-11 26 views
13

.NET 2.0 ve yukarı yapılandırma sistemi, dosya sistemindeki XML dosyalarından geldiği gerçeği değiştirmek istemediğiniz sürece oldukça güçlü ve genişletilebilir.Veritabanından .NET yapılandırmasını oku

Benim gereksinimimde, uygulamam erişimimin dışında bir yönetilen ortamda çalıştığından dosyaları değiştiremiyorum - ancak SQL Server veritabanını değiştirebilirim.

Bu nedenle, bir SQL tablosunda yapılandırma dosyalarını veya bölümlerini depolamayı düşünüyorum - ancak .NET 2.0 yapılandırma sistemini buna nasıl bağlarım?

Dosya sistemindeki bir * .config dosyasından değil, SQL veritabanındaki bir tablodan yapılandırma bölümlerini okuyacak bir "özel yapılandırma sağlayıcısı" yazmak için bir yol var mı?

Kendi özel ConfigurationSection veya ConfigurationElement öğemi veya kendi başına bir Özel Yapılandırma oluşturmayı düşünüyordum, ancak her zaman yapılandırma sistemindeki dosya sistemini genişletebileceğim noktada kalıyorum gibi görünüyor. beğendiğim gibi, ancak XML veri tabanlarımı bir veritabanı tablosundan okuyamıyorum .....

Neyi özlüyorum? Birisi bunu zaten yaptı ve paylaşmayı/paylaşmayı önemsedi mi?

Teşekkürler! Marc

Not: Ayrıca, yapılandırma XML'ini sadece bir dizeye okumaya çalıştım ve daha sonra uygun şekilde ServiceModelConfigSection - ne yazık ki, çünkü ConfigSection taban sınıfı bir şekilde XML serializable olması için gerekli bir yöntemi uygulamıyor ........ (YIKES !!!)

+0

Ancak, SQL bağlantınızın yapılandırma bilgilerini ayarlayabileceğiniz yer sorunu olmaz mı? DB ile bir bağlantınız olduğunda, ihtiyacınız olan ayarları yükleyebilirsiniz. App.Config, bir arama tablosundan daha fazla değildir. – sipwiz

+0

Evet - gerçekleştirmeye çalıştığım şey, WCF hizmetlerini bir veritabanından yapılandırmaktır. Bu WCF yapılandırma dosyaları QUITE BÜYÜK VE KOMPLEKSİ - ve tüm bu şeyleri atomik varsayımlara ayırmak istemiyorum -> config XML'i veritabanından okumak ve uygulamak istiyorum. –

+0

Ah tamam, bu daha mantıklı, ben bir db WCF yapılandırır neden kullanışlı olacağını görebiliyorum. Haklısınız ve App.Config dosyasını bir dosya yerine XML akışı veya bloğu olarak okumak için bir yol olmalı. – sipwiz

cevap

5

Orada yapıyor bahsediyor burada bir makale ne hakkında konuştuğunu: Özetle

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

ne yaptıklarını tipik dosyalarını .config şifrelemek için kullanılır ProtectedConfigurationProvider, türetilmiş bir sürümünü oluşturmaktır. Decrypt yönteminde, yapılandırma bilgilerinin şifresini çözmek yerine, bir veritabanından alınır.

+0

+1 - teşekkürler, çok ilginç! Henüz bir temel sınıf olarak "ProtectedConfigurationProvider" oldukça anlamsızdır .... ama bir deneyin! –

+2

Merhaba Keltex - çalışır - çoğunlukla - ama bence oldukça berbat bir HACK ..... çok kötü değil config sağlayıcıları doğrudan .NET yapılandırma sistemine takmak için "uygun", güzel, resmi bir yol yoktur ... .. –

+0

@marc_s Katılıyorum. Ama bu bir iş etrafında. – Keltex

1

Sen ihtiyaçlarınız için Cinchoo framework deneyebilirsiniz.

Bu Dosyaya Sicil, INI, Veritabanı vs. İşte

tanımlayıp Cinchoo çerçevesinin

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()); 
    } 

} 

Çok ilk kez kullanarak yapılandırma nesnesi kullanımı basit bir yoludur okuma ve yazma yapılandırma girişlerini destekler Uygulamayı çalıştırdığınızda, Cinchoo çerçevesi otomatik olarak aşağıdaki gibi yapılandırma bölümünü oluşturur. Daha sonra, bunları konfigürasyon kaynağı veya kod yoluyla kontrol edebilirsiniz.

<?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 ve yapılandırma bölümlerini bazı yansımalarla okurken aynı xml ayrıştırma .NET kullanımlarını kullanabilirsiniz.

İşte bunu yapmak için sample code.

Burada xml'de temsil edilmesini istediğiniz bir sınıf var. Bu dize (veya bir veritabanından) XML kullanarak bu ConfigurationSection'ı nasıl hazırladığınız aşağıda anlatılmıştır. Bu, yukarıdaki blog gönderisinde bağlantılı olan GitHub'daki testlerden alınmıştır.

[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); 
} 

Sen System.Configuration ad kullanarak bu yaklaşım ile tüm .NET asansör olsun.

+1

Güzel! Bu benim için harika çalıştı. Tek gotcha, XML'imin herhangi bir lider CRLF/whitespace olmadığından emin olma ihtiyacını içeriyordu. Bazı insanlar bunun gibi özel CLR yöntemlerine güvenmenin tehlikeli olduğunu söylemesine rağmen, benim için geri çekilmeye çalışıyorum koddan çok daha az skeçli. Bu, asıl soruna saldırırken, bu şeylerin bir kısmını destekleyecek büyük bir iskele yapar. Tekrar teşekkürler! – killthrush