2009-04-11 85 views
13

.NET 2.0及更高版本的配置系统功能强大且可扩展 - 只要您不希望更改其全部来自文件系统中XML文件的事实即可。从数据库中读取.NET配置

在我的要求中,我无法更改文件,因为我的应用程序运行在我无法访问的托管环境中 - 但我可以更改SQL Server数据库。

所以我正在寻找在SQL表中存储配置文件或节 - 但我怎么能将.NET 2.0配置系统绑定到这?

有没有办法编写一个“自定义配置提供程序”,它不会从文件系统中的* .config文件中读取其配置节,而是从SQL数据库中的表读取?

我一直在寻找创建自己的自定义ConfigurationSection或ConfigurationElement,甚至是自定义配置本身 - 但它似乎总是回到我可以在文件系统中扩展配置系统的地步因为我喜欢,但我不能让它读取我的XML片段从数据库表.....

我错过了什么?有人已经做过这件事,并且关心解释/分享?

谢谢! Marc

PS:我也试着只是将配置XML读入一个字符串,然后将其反序列化为合适的不幸的是,ServiceModelConfigSection不起作用,因为ConfigSection基类以某种方式没有实现它需要的XML序列化方法........(YIKES !!!)

+0

但不会uou有下落的问题为您的SQL连接的配置信息?一旦你连接到数据库,你可以加载你需要的任何设置。 App.Config不仅仅是查找表。 – sipwiz 2009-04-11 12:00:22

+0

是的 - 我试图完成的是从数据库中配置WCF服务。这些WCF的配置文件是非常庞大而复杂的 - 我真的不希望所有的东西分解成原子assigments - >我想读取数据库中的XML配置和应用它。 – 2009-04-11 12:30:44

+0

啊OK,那更有意义,我可以看到,为什么从分贝WCF CONFIGS将方便。我怀疑你是对的,并且必须有一些方法来让App.Config作为流或XML块而不是文件读入。 – sipwiz 2009-04-11 12:50:51

回答

1

你可以尝试Cinchoo framework满足您的需求。

它支持读写配置项文件,注册表,INI,数据库等

下面是简单的方法来定义和使用Cinchoo框架

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框架会自动生成如下的配置部分。然后,您可以通过配置源代码或代码来控制它们。

<?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

您可以使用相同的XML解析.NET读一些反思的Web.config和配置部分时使用。

这里是sample code做到这一点。

这里是要在XML代表的一类。

public class TestConfiguration : ConfigurationSection 
{ 
    [ConfigurationProperty("optionalProperty", DefaultValue = "defaultValue")] 
    public string OptionalProperty 
    { 
     get { return (string)base["optionalProperty"]; } 
     set { base["optionalProperty"] = value; } 
    } 

    [ConfigurationProperty("requiredProperty", IsRequired = true)] 
    public string RequiredProperty 
    { 
     get { return (string)base["requiredProperty"]; } 
     set { base["requiredProperty"] = value; } 
    } 
} 

以下是您如何使用来自字符串(或数据库)的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提升。