Чтение Конфигурационных Файлов Без Проблем

В этой статье я хотел бы рассмотреть проблему загрузки настроек из файлов конфигурации.

Обычно разработчики используют тяжеловесный и сложный 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

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.