.NET 2.0及更高版本的配置系统非常强大且可扩展 - 只要您不想更改它全部来自文件系统中的XML文件这一事实。
在我的要求中,我无法更改文件,因为我的应用程序在我无法访问的托管环境中运行 - 但我可以更改SQL Server数据库。
所以我正在考虑将配置文件或部分存储在SQL表中 - 但是如何将.NET 2.0配置系统绑定到这个?
有没有办法编写一个“自定义配置提供程序”,它不会从文件系统中的* .config文件中读取其配置节,而是从SQL数据库中的表读取?
我一直在寻找创建自己的自定义ConfigurationSection或ConfigurationElement,甚至是自定义配置本身 - 但似乎我总是最终回到我可以在文件系统中扩展配置系统的程度我喜欢,但我无法从数据库表中读取我的XML片段.....
我错过了什么?有人已经这样做了并且关心解释/分享?
谢谢! 马克
PS:我还尝试将配置XML读入字符串,然后将其反序列化为适当的字符串。 ServiceModelConfigSection - 遗憾的是,它不起作用,因为ConfigSection基类以某种方式没有实现XML序列化所需的方法........(YIKES !!!)
答案 0 :(得分:5)
这里有一篇文章谈到你正在谈论的事情:
http://www.wrox.com/WileyCDA/Section/Redirecting-Configuration-with-a-Custom-Provider.id-291932.html
总之,他们所做的是创建ProtectedConfigurationProvider的派生版本,该版本通常用于加密.config文件。在Decrypt方法中,不是解密配置信息,而是从数据库中检索它。
答案 1 :(得分: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提升。
答案 2 :(得分:1)
尝试使用“.NET应用程序和WCF服务的配置服务”,它是MSFT的StockTrader 2.0示例应用程序的一部分:
StockTrader 2.0 Configuration Service overview
答案 3 :(得分: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>
试试吧!