Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Powiązanie konfiguracji platformy .NET pobiera wartości konfiguracji za pośrednictwem dostawców konfiguracji i próbuje powiązać te wartości z właściwościami obiektu. Wcześniej, gdy wartość konfiguracji miała wartość null, binder potraktował go tak, jakby wartość w ogóle nie istniała i dlatego pominąła powiązanie. Innymi słowy, nie rozróżniała null wartości i brakujących wartości. To zachowanie spowodowało znaczne zamieszanie dla użytkowników, którzy spodziewali się jawnie zdefiniowanych null wartości w konfiguracji, aby były przestrzegane i właściwie powiązane.
Ponadto dostawca konfiguracji JSON wcześniej przekonwertował null wartości w konfiguracji na puste ciągi. Ponadto przyczyniło się to do zamieszania, ponieważ właściwości powiązane z tymi wartościami otrzymają pusty ciąg, a nie oczekiwaną wartość null.
Ta zmiana rozwiązuje oba problemy. Dostawca konfiguracji JSON teraz poprawnie zgłasza null wartości bez ich zmiany, a binder traktuje null wartości jako prawidłowe dane wejściowe, wiążąc je jak dowolną inną wartość.
Aktualizacja zawiera również ulepszenia obsługi wartości powiązań null w tablicach i umożliwia powiązanie pustych tablic.
Wersja wprowadzona
.NET 10
Poprzednie zachowanie
Wcześniej, gdy wartość konfiguracji to null, binder potraktował go tak, jakby wartość w ogóle nie istniała i w związku z tym pominąła powiązanie. System nie rozróżniał null wartości i brakujących wartości.
Ponadto dostawca konfiguracji JSON przekonwertował null wartości w konfiguracji na puste ciągi. Spowodowało to, że właściwości powiązane z tymi wartościami otrzymały pusty ciąg, a nie oczekiwaną nullwartość .
Rozważ następującą zawartość pliku appsettings.json konfiguracji:
{
"NullConfiguration": {
"StringProperty": null,
"IntProperty": null,
"Array1": [null, null],
"Array2": []
}
}
I odpowiedni kod powiązania:
public class NullConfiguration
{
public NullConfiguration()
{
// Initialize with non-default value to
// ensure binding overrides these values.
StringProperty = "Initial Value";
IntProperty = 123;
}
public string? StringProperty { get; set; }
public int? IntProperty { get; set; }
public string[]? Array1 { get; set; }
public string[]? Array2 { get; set; }
}
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build().GetSection("NullConfiguration");
// Now bind the configuration.
NullConfiguration? result = configuration.Get<NullConfiguration>();
Console.WriteLine($"StringProperty: '{result!.StringProperty}', intProperty: {(result!.IntProperty.HasValue ? result!.IntProperty : "null")}");
Console.WriteLine($"Array1: {(result!.Array1 is null ?
"null" : string.Join(", ", result!.Array1.Select(a => $"'{(a is null ? "null" : a)}'")))}");
Console.WriteLine($"Array2: {(result!.Array2 is null ?
"null" : string.Join(", ", result!.Array2.Select(a => $"'{(a is null ? "null" : a)}'")))}");
Wyjście:
StringProperty: '', intProperty: 123
Array1: '', ''
Array2: null
Wyjaśnienie danych wyjściowych:
-
StringPropertynull: Wartość w formacie JSON została przekonwertowana przez dostawcę JSON na pusty ciąg (""), zastępując wartość początkową. -
IntProperty: pozostał niezmieniony (123), ponieważ dostawca przekonwertowałnullna pusty ciąg, którego nie można przeanalizować jakoint?, więc oryginalna wartość została zachowana. -
Array1: Powiązana z tablicą zawierającą dwa puste ciągi, ponieważ każdynullelement tablicy był traktowany jako pusty ciąg. -
Array2: Pozostałnull, ponieważ pusta tablica[]w formacie JSON została zignorowana przez powiązanie.
Nowe zachowanie
Począwszy od platformy .NET 10, null wartości są teraz prawidłowo powiązane z odpowiednimi właściwościami, w tym elementami tablicy. Nawet puste tablice są poprawnie rozpoznawane i powiązane jako puste tablice, a nie ignorowane.
Uruchomienie tego samego przykładu kodu daje następujące wyniki przy użyciu dostawcy konfiguracji JSON:
StringProperty: 'null', intProperty: null
Array1: 'null', 'null'
Array2:
Typ zmiany przełamującej
Jest to zmiana zachowania.
Przyczyna zmiany
Poprzednie zachowanie było mylące i często doprowadziło do skarg użytkowników. Dzięki rozwiązaniu tego problemu proces powiązania konfiguracji jest teraz bardziej intuicyjny i spójny, zmniejszając zamieszanie i dostosowując zachowanie do oczekiwań użytkownika.
Zalecana akcja
Jeśli wolisz poprzednie zachowanie, możesz odpowiednio dostosować konfigurację:
- W przypadku korzystania z dostawcy konfiguracji JSON zastąp
nullwartości pustymi ciągami (""), aby przywrócić oryginalne zachowanie, gdzie puste ciągi są powiązane zamiastnull. - W przypadku innych dostawców, którzy obsługują
nullwartości, usuńnullwpisy z konfiguracji, aby zreplikować wcześniejsze zachowanie, gdzie brakujące wartości są ignorowane, a istniejące wartości właściwości pozostają niezmienione.