BLOG · .NET · BONNES PRATIQUES

Options Pattern en .NET : simplifiez vos configurations en 3 lignes de code

Illustration : une fenêtre de code avec des accolades et des lignes colorées, symbole d'une configuration .NET typée avec IOptions

Vous utilisez encore appsettings.json avec des Configuration["api_url"] éparpillés dans vos classes C# ? Et vous découvrez les erreurs de config seulement quand ça plante en prod ?

Avec l'Options Pattern, vous transformez votre configuration en objet C# typé, validé au démarrage de l'application. Je l'utilise dans tous mes projets.

Le problème : les chaînes magiques

Sans Options Pattern, votre code ressemble à ça :

var apiUrl = _configuration["ApiSettings:BaseUrl"];
var timeout = _configuration.GetValue<int>("ApiSettings:TimeoutInSeconds");

Résultat : des chaînes magiques partout, des fautes de frappe silencieuses, et si la structure de la config change, il faut repasser dans toutes les classes qui l'utilisent.

La solution, en 4 étapes

1 : La section dans appsettings.json

{
  "ApiConfig": {
    "Token": "a1b2c3d4e5f6g7h8i9j0",
    "ApiUrl": "https://api.antoine.fr",
    "TimeoutInSeconds": 30
  }
}

2 : La classe C# qui la représente

public class ApiConfig
{
    public string Token { get; init; }
    public string ApiUrl { get; init; }
    public int TimeoutInSeconds { get; init; }
}

3 : L'enregistrement dans Program.cs : les fameuses 3 lignes

builder.Services
    .AddOptions<ApiConfig>()
    .BindConfiguration("ApiConfig")
    .ValidateDataAnnotations();

4 : L'injection typée dans vos services

public class MyService
{
    private readonly HttpClient _httpClient;
    private readonly ApiConfig _apiConfig;

    public MyService(HttpClient httpClient, IOptions<ApiConfig> options)
    {
        _httpClient = httpClient;
        _apiConfig = options.Value;
    }

    public async Task<string> GetDataFromApiAsync()
    {
        var response = await _httpClient.GetAsync($"{_apiConfig.ApiUrl}/endpoint");
        response.EnsureSuccessStatusCode();
        return await response.Content.ReadAsStringAsync();
    }
}

Ce que ça change au quotidien

Organisé : une classe dédiée par section de votre appsettings.json.

Typé : vous accédez à options.ApiUrl au lieu de Configuration["api_url"] : une propriété plutôt qu'une chaîne magique.

Sécurisé : impossible de mal écrire la config, votre IDE vous alerte si la propriété n'existe pas.

Validé : ajoutez [Required] sur vos propriétés pour vérifier leur présence dès le démarrage : plus de mauvaise surprise en prod.

Simple : 3 lignes dans Program.cs et c'est configuré pour toute l'application.

Et pour ajouter une nouvelle config ?

Besoin d'un objet Datadog dans votre appsettings.json ? Créez une classe DatadogSettings calquée sur la section, enregistrez-la dans Program.cs, et c'est prêt à l'emploi : typé et validé.

À retenir : l'Options Pattern se met en place en quelques minutes et améliore durablement la lisibilité, la maintenabilité et la robustesse de vos projets .NET.

Cet article est tiré d'une de mes publications LinkedIn : rejoignez la discussion ↗