В этой статье я хотел бы рассмотреть проблему загрузки настроек из файлов конфигурации.
Обычно разработчики используют тяжеловесный и сложный API из пространства имен System.Configuration и шаг за шагом считывают настройки.
Если в конфигурационном файле раздел, который необходимо прочитать, представляет собой простую структуру (без вложенности), то в принципе чтение не вызывает особых проблем.
Однако как только конфигурация усложняется и/или появляются вложенные подразделы, парсинг становится настоящей головной болью.
Для простого и быстрого чтения настроек и загрузки их в память отлично подойдет библиотека КонфигурацияПарсер , который возьмет на себя все трудности работы с файлами конфигурации.
Монтаж
Эта библиотека доступна для скачивания через NuGet .Или вы можете скачать исходники с GitHub .
Применение
Для демонстрации возможностей библиотеки представим, что нашей программе необходимы настройки для подключения к нескольким внешним сервисам, базам данных, а также наша система должна иметь возможность отправлять письма системным администраторам.Мы решили, что эти настройки будут расположены в трёх разделах.
конфигурация системы
Следующий шаг — создание классов, в которых мы будем хранить настройки системы.<ExternalSystemSettings> <AuthenticationSettings> <Login>DotNetCraft</Login> <Token>qwerty</Token> <Urls> <Url> https://github.com/DotNetCraft/ConfigurationParser </Url> <Url> https://github.com/DotNetCraft/ConfigurationParser </Url> </Urls> </AuthenticationSettings> <StaffSettings Token="{D0C148F7-83C0-41B0-8F18-B47CAB09AD99}" Url=" https://github.com/DotNetCraft/ConfigurationParser"/ > </ExternalSystemSettings> <DatabasesSettings> <MongoSettings ConnectionString="mongo.url" DatabaseName="DotNetCraft"/> <SqlSettings> <item key="TenantA"> <value> <SqlSettings ConnectionString="sql.TenantA.com"/> </value> </item> <item> <key>TenantB</key> <value> <SqlSettings> <ConnectionString>sql.TenantB.com</ConnectionString> </SqlSettings> </value> </item> </SqlSettings> </DatabasesSettings> <SmtpSettings Host="gmail.com" Sender="no-reply"> <Recipients>[email protected];[email protected];[email protected]</Recipients> </SmtpSettings>
Классы конфигурации #region ExternalSystemSettings
class ExternalSystemSettings
{
public AuthenticationServiceSettings AuthenticationSettings { get; set; }
public StaffServiceSettings StaffSettings { get; set; }
}
class AuthenticationServiceSettings
{
public string Login { get; set; }
public string Token { get; set; }
public List<string> Urls { get; set; }
}
class StaffServiceSettings
{
public Guid Token { get; set; }
public string Url { get; set; }
}
#endregion
#region DatabasesSettings
class DatabasesSettings
{
public MongoDatabaseSettings MongoSettings { get; set; }
public Dictionary<string, SqlSettings> SqlSettings { get; set; }
}
class MongoDatabaseSettings
{
public string ConnectionString { get; set; }
public string DatabaseName { get; set; }
}
class SqlSettings
{
public string ConnectionString { get; set; }
}
#endregion
#region Smtp
class SmtpSettings
{
public string Host { get; set; }
public string Sender { get; set; }
[CustomStrategy(typeof(SplitRecipientsCustomStrategy))]
public List<string> Recipients { get; set; }
}
#endregion
В файле конфигурации нам нужно объявить, что мы будем использовать ConfigurationParser. Заполнение configSections в App.Config <Эxml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="ExternalSystemSettings" type="DotNetCraft.ConfigurationParser.SimpleConfigurationSectionHandler, DotNetCraft.ConfigurationParser" />
<section name="DatabasesSettings" type="DotNetCraft.ConfigurationParser.SimpleConfigurationSectionHandler, DotNetCraft.ConfigurationParser" />
<section name="SmtpSettings" type="DotNetCraft.ConfigurationParser.SimpleConfigurationSectionHandler, DotNetCraft.ConfigurationParser" />
</configSections>
…
</configuration>
Теперь мы можем легко и естественно прочитать нашу конфигурацию: ExternalSystemSettings externalSystemSettings = (dynamic)ConfigurationManager.GetSection("ExternalSystemSettings");
DatabasesSettings databasesSettings = (dynamic)ConfigurationManager.GetSection("DatabasesSettings");
После выполнения кода у нас будут созданы 2 объекта, которые будут содержать наши настройки.
Как вы правильно заметили, мы не читаем Настройки Смтп .
Это сделано для того, чтобы продемонстрировать дополнительные возможности утилиты.
В разных проектах вам может потребоваться записывать различные настройки в файлы конфигурации и иметь свою логику работы с ними.
Утилита спроектирована таким образом, что вы можете легко расширить ее, добавив новую стратегию и охватив все необходимые вам сценарии.
Например, давайте посмотрим на раздел Получатели : <Recipients>[email protected];[email protected];[email protected]</Recipients>
Этот раздел содержит список адресов электронной почты, разделенных точкой с запятой.
Согласно нашей спецификации и классу, мы должны записывать каждый адрес как отдельный элемент массива.
Для выполнения этой задачи нам нужно создать класс SplitRecipientsCustomStrategy и реализовать интерфейс ICustomMappingStrategy Пользовательская стратегия class SplitRecipientsCustomStrategy : ICustomMappingStrategy
{
#region Implementation of ICustomMappingStrategy
public object Map(string input, Type itemType)
{
string[] items = input.Split(';');
List<string> result = new List<string>();
result.AddRange(items);
return result;
}
public object Map(XmlNode xmlNode, Type itemType)
{
string input = xmlNode.InnerText;
return Map(input, itemType);
}
#endregion
}
Внутри нам необходимо реализовать алгоритм парсинга значения из секции в соответствии с нашей задачей.
Необходимо учитывать, что метод Карта (строковый ввод, тип itemType) вызывается, если значение считывается из атрибута, а метод Карта(XmlNode xmlNode, Тип itemType) Вызывается, если значение считывается из раздела.
Согласно файлу конфигурации, значение будет считываться из раздела.
После этого нам нужно пометить свойство Получатели атрибутом Пользовательская стратегия в котором нужно указать, какая «стратегия» будет использоваться для этого поля: [CustomStrategy(typeof(SplitRecipientsCustomStrategy))]
public List<string> Recipients { get; set; }
Всё, теперь мы можем прочитать настройки почты.
SmtpSettings smtpSettings = (dynamic)ConfigurationManager.GetSection("SmtpSettings");
Как вы видете, КонфигурацияПарсер делает работу по чтению настроек из файла конфигурации очень удобной и экономит массу времени.
В то же время его можно легко расширить, добавив новые стратегии.
Хотелось бы отметить еще одну особенность этой библиотеки.
Это атрибут PropertyMappingAttribute .
Его следует использовать, когда имя элемента в файле конфигурации не соответствует имени свойства.
Например, у нас есть раздел «Электронная почта», где записан текущий адрес электронной почты пользователя.
<Email>[email protected]</Email>
Но у нас в классе есть свойство для хранения этого значения.
Электронная почта пользователя .
Чтобы настройки считались корректно, нужно изменить это свойство с помощью атрибута PropertyMappingAttribute .
[PropertyMapping("Email")]
public string UserEmail { get; set; }
Таким образом, имена элементов в файле конфигурации не обязательно должны совпадать с именами свойств.
Если у вас есть вопросы или предложения, пишите их в комментариях, я с радостью на них отвечу.
Теги: #Configuration #xml #config #parser #read config #reading Configuration #Configuration #config file #appconfig #web.config #.
NET #xml #api
-
Статистика Продавцов Яндекс Маркета
19 Oct, 24 -
Турецкий Гамбит К Яндексу – Мнения Экспертов
19 Oct, 24 -
Ion Le – Специально Для Недорогих Ноутбуков
19 Oct, 24 -
Youtube Проник В Мобильные Телефоны Verizon
19 Oct, 24 -
Firefox 3 Ждет Инструкций Пользователя
19 Oct, 24