从数据库中读取.NET配置

13

.NET 2.0及以上版本的配置系统非常强大且可扩展,只要不想改变它全部来自文件系统中的XML文件这一事实。

在我的需求中,我无法更改文件,因为我的应用程序在我无法控制的受管环境中运行,但我可以更改SQL Server数据库。

因此,我正在考虑将配置文件或部分存储在SQL表中,但如何将.NET 2.0配置系统与其连接起来呢?

是否有一种方法可以编写“自定义配置提供程序”,使其不从文件系统中的*.config文件读取其配置节,而是从SQL数据库表中读取呢?

我一直在尝试创建自己的自定义ConfigurationSection、ConfigurationElement甚至是自定义Configuration,但似乎总是回到一个点:我可以尽可能地扩展文件系统中的配置系统,但我无法让它从数据库表中读取我的XML片段.....

我错过了什么?有人做过这个并愿意解释/分享吗?

谢谢! Marc

PS:我还尝试了只将配置XML读入字符串,然后将其反序列化为适当的例如ServiceModelConfigSection - 不幸的是,这种方法行不通,因为ConfigSection基类某些方法未实现,因此无法进行XML序列化....... (天啊!!!)


但是,您不会遇到在哪里设置SQL连接的配置信息的问题吗?一旦您连接到数据库,您可以加载所需的任何设置。App.Config不过是一个查找表。 - sipsorcery
是的 - 我想要实现的是从数据库中配置WCF服务。那些WCF配置文件非常庞大和复杂 - 我真的不想将所有这些东西分解为原子赋值 --> 我想从数据库中读取配置XML并应用它。 - marc_s
啊,好的,这样更有意义,我可以理解为什么从数据库中获取WCF配置会很方便。我猜你是对的,一定有一些方法可以将App.Config作为流或XML块读入,而不是作为文件。 - sipsorcery
5个回答

5

+1 - 谢谢,非常有趣!暂时还不能完全理解"ProtectedConfigurationProvider"作为基类的意义....但我会尝试一下! - marc_s
2
嗨Keltex - 它可以工作 - 大多数情况下 - 但在我看来,这是一个相当可怕的黑客行为.....太糟糕了,没有“适当的”,好的,官方的方法直接将配置提供程序插入到.NET配置系统中..... - marc_s

3
你可以使用反射技术,使用与读取web.config和配置部分相同的xml解析器,进行翻译。以下是执行此操作的示例代码: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的提升。

1
不错!这对我非常有效。唯一需要注意的是确保我的XML没有任何前导CRLFs/空格。虽然有些人说依赖私有CLR方法可能存在危险,但对我来说比我试图重构的代码要可靠得多。这是一个很好的脚手架,可以支撑一些东西,同时我攻击主要问题。再次感谢! - killthrush

1

您可以尝试使用Cinchoo框架来满足您的需求。

它支持将配置条目读取和写入到文件、注册表、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>

试一下!


1

0
您可以尝试使用现成的JsonRepositoryConfiguration Nuget包,它正是这样做的。它还具有自动刷新功能,并且几乎与JSON配置文件的配置相同,只是它期望从您的存储库中获取JSON配置,该存储库可以从任何内部/外部存储中获取数据,包括进行数据库调用、API调用等。
如果您愿意,您可以混合使用不同的配置提供程序(例如此类和JSON配置文件)并将它们一起使用。坦白说:我是作者。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接