Прочитать конфигурацию .NET из базы данных

Система конфигурации .NET 2.0 и выше достаточно мощная и расширяемая - пока вы не хотите изменять факт, что все это происходит из файлов XML в файловой системе.

В моем требовании я не могу изменять файлы, так как мое приложение работает в управляемой среде вне моей досягаемости - но я могу изменить базу данных SQL Server.

Итак, я смотрю на сохранение конфигурационных файлов или разделов в таблице SQL, но как я могу связать конфигурационную систему .NET 2.0 с этим?

Есть ли способ написать "пользовательский поставщик конфигурации", который будет читать свои разделы конфигурации не из файла *.config в файловой системе, а из таблицы в базе данных SQL?

Я искал создание собственного настраиваемого ConfigurationSection или ConfigurationElement или даже настраиваемой конфигурации как таковой, но кажется, что я всегда возвращаюсь в тот момент, когда я могу расширить конфигурационную систему в файловой системе, Мне нравится, но я не могу заставить его читать мои XML-фрагменты из таблицы базы данных.....

Что мне не хватает? Кто-то сделал это уже и позаботится объяснить/поделиться?

Спасибо! Марк

PS: Я также попытался просто прочитать конфигурационный XML файл в строку и затем десериализовать его в соответствующий, например. ServiceModelConfigSection - это не работает, к сожалению, потому что базовый класс ConfigSection каким-то образом не реализует метод, который необходим для его XML-сериализации... (YIKES!!!)

Ответы

Ответ 1

Здесь есть статья, в которой говорится о том, что вы делаете:

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

В общем, что они делают, это создать производную версию ProtectedConfigurationProvider, которая обычно используется для шифрования файлов .config. В методе Decrypt вместо дешифрования информации о конфигурации он извлекается из базы данных.

Ответ 2

Вы можете использовать тот же синтаксический анализ xml.NET, который используется при чтении разделов web.config и конфигурации с некоторым отражением.

Вот пример кода, чтобы сделать это.

Вот класс, который вы хотите представить в 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; }
    }
}

Вот как вы создаете экземпляр этого ConfigurationSection, используя XML из строки (или базы данных). Это было взято из тестов 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);
}

Вы получаете весь листинг .NET с помощью этого подхода, используя пространство имен System.Configuration.

Ответ 4

Вы можете попробовать 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>

Попробуйте!