0Pricing
C# Academy · Leçon

Options fortement typées avec IOptions

Liez les sections de configuration à des classes POCO avec IOptions , IOptionsSnapshot et IOptionsMonitor .

Options fortement typées avec IOptions est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C# Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C# Academy comprend 4 leçons au total.

Pourquoi utiliser des options fortement typées ?

Lire la configuration avec IConfiguration["Key"] renvoie des chaînes non typées. Le modèle Options associe les sections de configuration à des classes C#, ce qui fournit une sécurité à la compilation, IntelliSense et la prise en charge de la validation.

Définir une classe d’options

Créez une classe POCO simple dont les noms de propriétés correspondent à vos clés JSON. Par convention, ajoutez une constante statique SectionName pour identifier la section de configuration.

// Configuration class
public class JwtOptions
{
    public const string SectionName = "Jwt";

    public string SecretKey { get; set; } = string.Empty;
    public string Issuer    { get; set; } = string.Empty;
    public string Audience  { get; set; } = string.Empty;
    public int    ExpiryMinutes { get; set; } = 60;
}

// appsettings.json:
{
  "Jwt": {
    "SecretKey": "my-very-secret-key",
    "Issuer": "https://myapp.com",
    "Audience": "https://myapp.com/api",
    "ExpiryMinutes": 120
  }
}

Enregistrer les options

Appelez Configure<T> pour lier une section de configuration à la classe d’options. Cela enregistre IOptions<T>, IOptionsSnapshot<T> et IOptionsMonitor<T> dans DI.

// Registration
builder.Services.Configure<JwtOptions>(
    builder.Configuration.GetSection(JwtOptions.SectionName));

// Alternative shorthand:
builder.Services
    .AddOptions<JwtOptions>()
    .BindConfiguration(JwtOptions.SectionName);

// Consuming via IOptions<T>:
public class TokenService
{
    private readonly JwtOptions _opts;

    public TokenService(IOptions<JwtOptions> opts)
        => _opts = opts.Value;

    public string CreateToken()
        => $"Issuer={_opts.Issuer}, Exp={_opts.ExpiryMinutes}m";
}

IOptions vs IOptionsSnapshot vs IOptionsMonitor

Il existe trois variantes, avec des durées de vie et des comportements de rechargement différents. Choisissez celle qui convient à votre cas d’utilisation.

// IOptions<T> — Singleton, reads config ONCE at startup
public class ApiClient(IOptions<ApiOptions> opts)
{
    private readonly ApiOptions _opts = opts.Value; // never changes
}

// IOptionsSnapshot<T> — Scoped, reloads per request
public class ReportService(IOptionsSnapshot<ReportOptions> opts)
{
    private readonly ReportOptions _opts = opts.Value; // fresh per request
}

// IOptionsMonitor<T> — Singleton, live updates + change notifications
public class FeatureService(IOptionsMonitor<FeatureFlags> monitor)
{
    public bool IsEnabled(string feature)
        => monitor.CurrentValue.EnabledFeatures.Contains(feature);
}

Validation des options avec des attributs

Décorez les propriétés des options avec des attributs System.ComponentModel.DataAnnotations et appelez ValidateDataAnnotations() pour échouer immédiatement au démarrage si la configuration n’est pas valide.

using System.ComponentModel.DataAnnotations;

public class SmtpOptions
{
    [Required]
    public string Host { get; set; } = string.Empty;

    [Range(1, 65535)]
    public int Port { get; set; } = 587;

    [Required, EmailAddress]
    public string FromAddress { get; set; } = string.Empty;
}

// Register with validation:
builder.Services
    .AddOptions<SmtpOptions>()
    .BindConfiguration("Smtp")
    .ValidateDataAnnotations()
    .ValidateOnStart(); // fail at startup, not first use

Validation personnalisée avec IValidateOptions

Pour les règles complexes entre propriétés, implémentez IValidateOptions<T> afin de disposer d’une logique complète de validation programmatique.

public class JwtOptionsValidator : IValidateOptions<JwtOptions>
{
    public ValidateOptionsResult Validate(string? name, JwtOptions opts)
    {
        var errors = new List<string>();

        if (string.IsNullOrWhiteSpace(opts.SecretKey))
            errors.Add("SecretKey must not be empty");

        if (opts.SecretKey.Length < 32)
            errors.Add("SecretKey must be at least 32 characters");

        if (opts.ExpiryMinutes <= 0)
            errors.Add("ExpiryMinutes must be positive");

        return errors.Any()
            ? ValidateOptionsResult.Fail(errors)
            : ValidateOptionsResult.Success;
    }
}

builder.Services.AddSingleton<IValidateOptions<JwtOptions>, JwtOptionsValidator>();

Post-Configure

PostConfigure s’exécute après tous les appels à Configure et vous permet de remplacer ou de calculer des valeurs — ce qui est utile pour les propriétés calculées ou les ajustements propres à l’environnement.

builder.Services.Configure<CacheOptions>(
    builder.Configuration.GetSection("Cache"));

// Override in test environment:
builder.Services.PostConfigure<CacheOptions>(opts =>
{
    if (builder.Environment.IsEnvironment("Testing"))
    {
        opts.AbsoluteExpirationMinutes = 1; // very short in tests
        opts.UseDistributedCache = false;   // use in-memory cache
    }
});

// PostConfigure always runs LAST, even after AddOptions validators

Options nommées

Lorsque vous avez besoin de plusieurs instances du même type d’options, par exemple deux serveurs SMTP, utilisez des options nommées pour les différencier.

// Register named options:
builder.Services.Configure<SmtpOptions>("Primary",
    builder.Configuration.GetSection("Smtp:Primary"));
builder.Services.Configure<SmtpOptions>("Backup",
    builder.Configuration.GetSection("Smtp:Backup"));

// Consume with IOptionsMonitor (supports named options):
public class EmailSender
{
    private readonly SmtpOptions _primary;
    private readonly SmtpOptions _backup;

    public EmailSender(IOptionsMonitor<SmtpOptions> monitor)
    {
        _primary = monitor.Get("Primary");
        _backup  = monitor.Get("Backup");
    }
}

Raccourci BindConfiguration

La chaîne AddOptions().BindConfiguration() est la manière moderne et fluide d’enregistrer, de lier, de valider et d’échouer immédiatement, le tout dans une seule expression.

// Full registration chain:
builder.Services
    .AddOptions<DatabaseOptions>()
    .BindConfiguration("Database")          // bind section
    .ValidateDataAnnotations()               // attribute validation
    .Validate(opts =>                        // custom rule
        opts.MaxPoolSize >= opts.MinPoolSize,
        "MaxPoolSize must be >= MinPoolSize")
    .ValidateOnStart();                      // fail at startup

// Shorthand for simple cases:
builder.Services.AddOptions<AppOptions>()
    .BindConfiguration(AppOptions.SectionName)
    .ValidateOnStart();

En pratique : options des indicateurs de fonctionnalité

Une configuration complète d’options pour les indicateurs de fonctionnalité, avec prise en charge du rechargement, permettant de modifier les bascules dans appsettings sans redéploiement.

public class FeatureFlags
{
    public bool EnableNewCheckout  { get; set; }
    public bool EnableAISearch     { get; set; }
    public bool EnableBetaDashboard { get; set; }
}

// appsettings.json:
// { "FeatureFlags": { "EnableNewCheckout": true, ... } }

builder.Services
    .AddOptions<FeatureFlags>()
    .BindConfiguration("FeatureFlags")
    .ValidateOnStart();

// In a controller or service:
public class CheckoutController : ControllerBase
{
    private readonly FeatureFlags _flags;

    public CheckoutController(IOptionsMonitor<FeatureFlags> m)
        => _flags = m.CurrentValue;

    [HttpGet("/checkout")]
    public IActionResult Index() =>
        _flags.EnableNewCheckout
            ? Ok("new checkout")
            : Ok("legacy checkout");
}

Vérification rapide

Quelle variante de IOptions devez-vous utiliser dans un service à instance unique qui doit refléter les changements de configuration en temps réel ?

Récapitulatif : options fortement typées avec IOptions

Points clés à retenir :

  • Le modèle Options lie les sections de configuration à des POCO via Configure<T> ou AddOptions<T>().BindConfiguration()
  • IOptions<T> : instance unique, lecture unique au démarrage
  • IOptionsSnapshot<T> : à portée limitée, rechargement à chaque requête — ne l’injectez pas dans des services à instance unique
  • IOptionsMonitor<T> : compatible avec les services à instance unique, avec CurrentValue en temps réel et OnChange
  • Validez avec DataAnnotations + ValidateDataAnnotations() + ValidateOnStart()
  • Options nommées pour plusieurs instances du même type

Questions Fréquemment Posées

La leçon « Options fortement typées avec IOptions » est-elle gratuite ?

Oui — le texte complet de « Options fortement typées avec IOptions » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C# Academy, passe à CoddyKit PRO. Le cours C# Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Options fortement typées avec IOptions » ?

Liez les sections de configuration à des classes POCO avec IOptions , IOptionsSnapshot et IOptionsMonitor . Tu pratiques C# Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer C# Academy ?

Aucune expérience préalable n'est requise. C# Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Options fortement typées avec IOptions » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon C# Academy ?

Oui. Chaque leçon C# Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Sources et fournisseurs de configuration
  2. Options fortement typées avec IOptions
  3. Validation des options et options nommées
  4. Gestion des secrets
← Retour à C# Academy