A ConfigurationBinder csendesen kihagyja az érvénytelen tömbelemeket

A .NET 8-tól kezdve csendben kihagyja azokat a tömb- és listaelemeket, ConfigurationBinder amelyek értékei nem konvertálhatók céltípusra. Korábban a sikertelen elemek helyőrzőként null lettek megőrizve, és az eredményként kapott gyűjtemény a konfigurációs forrás elemeinek számával megegyező hosszúságú maradt.

Bevezetett verzió

.NET 8

Előző viselkedés

Korábban, amikor egy tömb- vagy listatulajdonságot Get<T>(IConfiguration) vagy Bind(IConfiguration, Object) kötöttünk, ha egy elem értékét nem sikerült konvertálni a céltípusra, akkor az eredményben ez az elem null helyőrzőként megmaradt. A gyűjtemény hossza megegyezett a konfiguráció elemeinek számával.

// 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)

Új viselkedés

.NET 8-tól kezdve az elemek, amelyeknél a típuskonverzió sikertelen, csendben kihagyásra kerülnek. Az eredményül kapott gyűjtemény csak sikeresen kötött elemeket tartalmaz, és rövidebb hosszúságú, mint a konfigurációs forrás bejegyzéseinek száma.

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

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

A kompatibilitástörő változás típusa

Ez a változás viselkedésbeli változás.

A változás oka

A belső implementáció ConfigurationBinder átalakításra került a .NET 8-ban. Ahelyett, hogy a céltömböt és a kötéselemeket helyben osztanák ki (ami a konvertálási hiba miatt maradt null ), a kötési eszköz mostantól csak a sikeresen kötött elemeket gyűjti össze egy ideiglenes listába, mielőtt a végső tömböt véglegesítené.

Az előző viselkedés az olyan értéktípusok esetében is problémás volt, mint a int[]. Érvénytelen konfigurációs érték esetén a kötőközeg a 0 értéket tárolná, amely nem lenne megkülönböztethető egy valódi 0 értéktől. Az új viselkedés elkerüli ezt a kétértelműséget.

  • A fejlesztés során lehetővé teszi az érvénytelen konfigurációs értékek azonnali felszínre hozásának engedélyezését ErrorOnUnknownConfiguration az elemek csendes elvetése helyett:

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

    A .NET 8-tól kezdődően ez a beállítás azt is eredményezi, hogy ConfigurationBinder egy InvalidOperationException kivételt dob, ha az értéket nem lehet a céltípusra konvertálni. További információért lásd: ConfigurationBinder kivételt dob, ha az értékek nem egyeznek.

  • Érvénytelen konfigurációs értékek javítása. Győződjön meg arról, hogy a konfigurációs forrás összes értéke megegyezik a kötött modell várt típusaival.

  • Ellenőrizze a gyűjtemény hosszát a kötés után, ha a kód a konfigurációs forrásnak megfelelő elemek számától függ.

  • Használjon sztringtulajdonságokat manuális elemzéssel , ha elegánsan kell kezelnie a nem átalakítható értékeket, és meg kell őriznie az összes tömbbejegyzést.

Érintett API-k