Прочитать конфигурацию .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.
Ответ 3
Попробуйте "Служба конфигурации для приложений .NET и служб WCF", является частью примера приложения StockTrader 2.0 от MSFT:
Обзор службы конфигурации StockTrader 2.0
StockTrader 2.0 Документация по обслуживанию конфигурации
Загрузить StockTrader 2.0 для .NET 4.0
Ответ 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>
Попробуйте!