Конфигурирование приложений¶
Все возможные параметры, которые влияют на работу приложений, обязательно должны быть вынесены в файл конфигурации.
Файл конфигурации должен быть yml.
Для удобного и единообразного чтения конфига во всех наших приложениях нужно использовать Curiosity.Utils.Configs, который доступен в публичном nuget'е.
Для упрощения понимания файлов конфигурации всей командой разработки (разработчиками, тестировщиками, сис.админами) наименование параметров и их величины приводятся к единому стилю. Ко всем параметрам нужно оставлять комментарии, чтобы было проще менять параметры на prod (особенно в спешке, особенно ночью).
Наименование файлов конфигурации¶
Файл должен называться config.yml.
Допускается создание файлов конфигурации под различные окружения в формате config.{Environment}.yml, где {Environment} - название окружения (например, config.Staging.yml).
Приветствуется создание файлов, уникальных для разработчика, в формате config.Development.{UserName}.yml, где {UserName} - имя пользователя на компе разработчика (например, config.Development.markeli.yml).
Не забывайте выставить
Copy alwaysдля файла, чтобы он копировался при сборке проекта.
Конфигурации в C#¶
Общие принципы¶
Для единообразия объекты конфигурации в коде именуем в едином стиле.
Кофигурация¶
Все, что связано с конфигурацией приложения, должно находиться в корне в каталоге Configuration.
Конфигурация - главный класс настройки приложения. Должен называться {AppName}Config, например, WebSiteConfig.
Опции¶
Опции - настройки и параметры отдельных подсистем или сервисов (например, параметры EMail, подключения к БД и т.д.). Их нужно выносить в отдельный класс. Класс должен оканчиваться на *Options (например, TempFileOptions).
Такие параметры сознательно именуются
Options, чтобы из названия было понятно, что они лишь часть настроек системы, а не все настройки целиком.
Если опции надо валидировать (о валидации ниже) или они шарятся между несколькими приложениями, то в основной сборке лучше создать для опций отдельный класс, в котором будет реализована валидация. Тогда в файле конфигурации под эту опцию добавится отдельная секция:
DisableRegistration: false
IsWCIOM: false
AllowMultipleExportsPerProject: true
ShortLinkUrlMask: "{0}://devsharp.siisltd.ru/wsu/{1}"
WebDataBaseUrl: http://localhost:36265/
WebSiteBaseUrl: http://localhost:36265/
LogRequestContent: false
TempPath: ./.temp
ExportPath: ./export
ExportUrlBase: /export
# опция в виде отдельной секции
MailGun
ApiKey: {magic-key}
Domain: mg.survey-studio.com
ApiUrl: https://api.mailgun.net/v3
Валидация¶
На старте приложение должно провалидировать настройки.
Это делается для того, чтобы приложение упало сразу, если что-то не так.
И опции, и конфигурации, если они могут себя провалидировать, должны реализовывать интерфейс IValidatableOption с методом Validate, в котором должна происходить валидация.
Логирования¶
На старте после чтения файла конфига приложение должно залогировать прочитанные настройки.
Это делается для того, чтобы мы понимали, с какими параметрами запускается наш сервис.
Для упрощения логирования можно класс конфигурации отнаследовать от ILoggable.
Значения по умолчанию¶
Для параметров можно задавать значения по умолчанию. Это делать нужно в самих классах.
Временные параметры¶
Периоды¶
При необходимости указания периода работы сервиса, времени жизни объекта (TTL) название параметра должно принимать вид названиеСуффикс, где название - название параметра, а суффикс - единица измерения на английском (ms, sec, min, hour, day).
Пример:
pingPeriodMs: 500
actionIdTtlMin: 10
Точное время¶
Если необходимо указать конкретное время для выполнения операции (например, запуск фоновой задачи чистки базы, то время указывается в стандартном для .net формате TimeSpan (d.hh.mm.ss.ms)
День и миллисекунды являются необязательными.