Перейти к содержанию

Конфигурирование приложений

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

Файл конфигурации должен быть 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) День и миллисекунды являются необязательными.