.Net Core Configuration GetSection VS GetRequiredSection

Il y a quelques mois, suite à un problème avec une section dans un fichier de configuration, je me suis rendu compte que la méthode GetSection ne provoquait aucune erreur si la section n’était pas présente.

Cela était ennuyant car dans mon cas, il s’agissait de la section NLOG. Du coup nous n’avions pas de LOG! En cherchant un peu, je me suis rendu compte qu’il n’y avait pas de méthode qui permet de rendre une section de configuration obligatoire. Un peu comme le GetService VS GetRequiredService dans la gestion IOC le second renvoie une exception si le type demandé n’est pas défini.

Je suis donc parti sur le même principe si une section requise n’est pas présente, le but est d’avoir une InvalidOperationException avec un message clair.

System.InvalidOperationException: 'Section 'SampleSection' not found in configuration.'

Pour cela, j’ai donc créé une issue sur le repository officiel. Et fait un pull request. Pour la petite histoire dans ma première version, je proposais de l’ajouter directement dans l’interface IConfiguration. Cependant, cela aurait introduit un breaking change pour les personnes qui auraient fait leur propore implémentation de cette interface. Du coup, on m’a proposé de l’ajouter comme méthode d’extension : Microsoft.Extensions.Configuration et qui sera disponible dans le package nuget : microsoft.extensions.configuration.abstractions. Mais pas de chance, le code freeze du .Net Core 5 était passé de quelques jours. Cela a donc été mergé dans la branch master qui sera la branch pour le .Net Core 6.

Mais pas de soucis, si vous désirez tout de même utiliser cette nouvelle méthode du framework avant novembre 2021, voici comme faire.

A savoir qu’il y a un daily build de la future version .Net Core 6 (branche master) et que les packages nuget y sont déposés tous les jours et que celui-ci est bien compatible avec la version 5. Du coup, vous pouvez soit l’ajouter dans vos nuget package sources dans visual studio (Tools => Options => Nuget Package Manager => Packages Sources). Ou alors avec un fichier nuget.config à la racine de votre solution. Une fois cela fait, il vous restera à installer le package nuget microsoft.extensions.configuration.abstractions

Ensuite, vous pourrez utiliser la méthode GetRequiredSection

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            //raise exception on startup
            var configSection = Configuration.GetRequiredSection(SampleOptions.ConfigurationName);
            services.Configure<SampleOptions>(configSection);

            //// raise exception on fisrt usage
            //services.Configure<SampleOptions>(options =>
            //{
            //    Configuration.GetRequiredSection(SampleOptions.ConfigurationName).Bind(options);
            //});

Dans l’exemple, la première utilisation lèvera une exception immédiatement au démarrage de l’application si la section est manquante. Car le comportement du framework dans le second cas est seulement lors de la première utilisation d’exécuter la méthode Bind.

    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        private readonly ILogger<WeatherForecastController> _logger;
        private readonly SampleOptions _sampleOptions;

        public WeatherForecastController(ILogger<WeatherForecastController> logger, IOptions<SampleOptions> options)
        {
            _logger = logger;
            _sampleOptions = options.Value;
        }

        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            var rng = new Random();
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)],
                AdditionalDataFromConfig = _sampleOptions.SampleProperty
            })
            .ToArray();
        }
    }

Vous pouvez retrouver un exemple complet de son utilisation ici.

Publicité

2 commentaires sur “.Net Core Configuration GetSection VS GetRequiredSection

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.