При разработке надежных .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получит defaultfalse, если ключ отсутствует.
Шаг 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.

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