ConfigurationBinder negeert zonder melding ongeldige array-elementen

Vanaf .NET 8 wordt ConfigurationBinder stilzwijgend array- en lijstelementen overgeslagen waarvan de waarden niet naar het doeltype kunnen worden geconverteerd. Voorheen werden mislukte elementen bewaard als null tijdelijke aanduidingen en bleef de resulterende verzameling dezelfde lengte behouden als het aantal elementen in de configuratiebron.

Geïntroduceerde versie

.NET 8

Vorig gedrag

Voorheen, bij het binden van een matrix- of lijsteigenschap via Get<T>(IConfiguration) of Bind(IConfiguration, Object), als de waarde van een element niet kon worden geconverteerd naar het doeltype, bleef dat element behouden als tijdelijke null aanduiding in het resultaat. De lengte van de verzameling komt overeen met het aantal elementen in de configuratie.

// Configuration source, for example, appsettings.json:
// "Items": [
//   { "Name": "A", "Interval": 10 },
//   { "Name": "B", "Interval": "a" }   <-- invalid int
// ]

var settings = configuration.GetSection("Items").Get<MyItem[]>();

// .NET 6/7 result:
// settings.Length == 2
// settings[0] = { Name = "A", Interval = 10 }
// settings[1] = null   (conversion failed, placeholder preserved)

Nieuw gedrag

Vanaf .NET 8 worden elementen die niet kunnen worden omgezet ongemerkt overgeslagen. De resulterende verzameling bevat alleen met succes gebonden elementen en heeft een kortere lengte dan het aantal vermeldingen in de configuratiebron.

var settings = configuration.GetSection("Items").Get<MyItem[]>();

// .NET 8+ result:
// settings.Length == 1
// settings[0] = { Name = "A", Interval = 10 }

Type van brekende verandering

Deze wijziging is een gedragswijziging.

Reden voor wijziging

De interne implementatie van ConfigurationBinder is geherstructureerd in .NET 8. In plaats van vooraf de doelarray te reserveren en elementen op hun plaats te binden (waardoor null achterblijft bij conversiefouten), verzamelt de binder nu alleen succesvol gebonden elementen in een tijdelijke lijst voordat het uiteindelijke array wordt gerealiseerd.

Het vorige gedrag was ook problematisch voor waardetypen zoals int[]. Voor een ongeldige configuratiewaarde zou de binder 0 opslaan, wat niet te onderscheiden was van een legitieme waarde van 0. Het nieuwe gedrag voorkomt deze dubbelzinnigheid.

  • Schakel ErrorOnUnknownConfiguration tijdens de ontwikkeling in om ongeldige configuratiewaarden onmiddellijk weer te geven in plaats van elementen op de achtergrond te verwijderen:

    var settings = configuration.GetSection("Items").Get<MyItem[]>(options =>
        options.ErrorOnUnknownConfiguration = true);
    

    Vanaf .NET 8 zorgt deze optie ervoor dat ConfigurationBinder een InvalidOperationException veroorzaakt wanneer een waarde niet kan worden geconverteerd naar het doeltype. Voor meer informatie, zie ConfigurationBinder geeft een foutmelding voor niet-overeenkomende waarde.

  • Corrigeer ongeldige configuratie-instellingen. Zorg ervoor dat alle waarden in uw configuratiebron overeenkomen met de verwachte typen voor het afhankelijke model.

  • Valideer de lengte van de verzameling na de binding als uw code afhankelijk is van het aantal elementen dat overeenkomt met de configuratiebron.

  • Gebruik tekenreekseigenschappen met handmatige parsering als u onconvertibele waarden correct wilt afhandelen en alle matrixvermeldingen wilt behouden.

Betreffende API's