Udostępnij przez


Wartości null zachowane w konfiguracji

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:

  • StringProperty null: 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ł null na pusty ciąg, którego nie można przeanalizować jako int?, więc oryginalna wartość została zachowana.
  • Array1: Powiązana z tablicą zawierającą dwa puste ciągi, ponieważ każdy null element 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.

Jeśli wolisz poprzednie zachowanie, możesz odpowiednio dostosować konfigurację:

  • W przypadku korzystania z dostawcy konfiguracji JSON zastąp null wartości pustymi ciągami (""), aby przywrócić oryginalne zachowanie, gdzie puste ciągi są powiązane zamiast null.
  • W przypadku innych dostawców, którzy obsługują null wartości, usuń null wpisy 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.

Interfejsy API, których dotyczy problem