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