← Назад ко всем статьям

Proactive configuration validation в .NET: предотвращаем ошибки заранее

Опубликовано

При разработке надежных .NET-приложений одна из лучших практик - валидировать конфигурацию при старте. Это помогает избежать ситуаций, когда критичные параметры, например feature flags, пропали из appsettings.json после merge conflict или случайного удаления.

Если значение отсутствует, приложение может все равно запуститься и тихо взять default, например false для bool. Так появляются скрытые production bugs, которые сложно отследить. Вместо этого лучше использовать fail-fast подход: приложение должно отказываться стартовать, если конфигурация невалидна.

Пример проблемы

{
  "FeatureManagement": {
    //"NewDashboard": true  // Missing parameter will default to false
  }
}

В этом случае приложение стартует с NewDashboard = false, даже если вы ожидали true.

Шаг 1 - Определяем configuration class

Создайте класс, который представляет section конфигурации, например FeaturesConfig.

public class FeaturesConfig
{
    public bool NewDashboard { get; set; }
}

Одного этого недостаточно, потому что NewDashboard получит default false, если ключ отсутствует.

Шаг 2 - Добавляем validation attributes

Используйте стандартные DataAnnotations, чтобы пометить required fields. Сделайте property nullable, чтобы binder мог отличить “missing” от “false”.

using System.ComponentModel.DataAnnotations;

public class FeaturesConfig
{
    [Required]
    public bool? NewDashboard { get; set; }
}

Шаг 3 - Включаем validation при старте

При регистрации options в Program.cs добавьте .ValidateDataAnnotations() и .ValidateOnStart().

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddOptions<FeaturesConfig>()
    .Bind(builder.Configuration.GetSection(nameof(FeaturesConfig)))
    .ValidateDataAnnotations()
    .ValidateOnStart();

var app = builder.Build();
app.Run();

Примечание: .ValidateOnStart() появился в .NET 6. С ним приложение валидирует options во время startup и выбрасывает OptionsValidationException, если required fields отсутствуют.

Это сразу укажет на проблему с конфигурацией и защитит систему от непредсказуемого поведения в production.

image

Этот простой механизм - важный шаг к созданию более стабильных и предсказуемых приложений.