Чтение конфигурации .NET из базы данных - PullRequest
13 голосов
/ 11 апреля 2009

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

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

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

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

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

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

Спасибо! Marc

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

Ответы [ 4 ]

5 голосов
/ 11 апреля 2009

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

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

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

3 голосов
/ 07 августа 2012

Вы можете использовать тот же 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.

1 голос
/ 23 марта 2012

Вы можете попробовать Cinchoo Framework для ваших нужд.

Поддерживает чтение и запись записей конфигурации в файл, реестр, INI, базу данных и т. Д.

Вот простой способ определить и использовать объект конфигурации с помощью Cinchoo Framework

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 Framework автоматически генерирует раздел конфигурации, как показано ниже. Затем вы можете управлять ими либо через источник конфигурации, либо с помощью кода.

<?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 голос
/ 16 декабря 2010

Попробуйте воспользоваться «Службой конфигурации для приложений .NET и служб WCF», входящей в пример приложения StockTrader 2.0 от MSFT:

Обзор службы настройки StockTrader 2.0

Документация службы настройки StockTrader 2.0

Загрузить StockTrader 2.0 для .NET 4.0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...