Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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.
Javasolt művelet
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
- Microsoft.Extensions.Configuration.ConfigurationBinder.Get<T>(IConfiguration)
- Microsoft.Extensions.Configuration.ConfigurationBinder.Get<T>(IConfiguration, Action<BinderOptions>)
- Microsoft.Extensions.Configuration.ConfigurationBinder.Bind(IConfiguration, Object)
- Microsoft.Extensions.Configuration.ConfigurationBinder.Bind(IConfiguration, Object, Action<BinderOptions>)