Zincirlenmiş yapılandırmadaki boş dizeler önceki sağlayıcıların üzerine yazar

.NET 11'den başlayarak, AddConfiguration kullanılarak eklenen bir yapılandırma boş bir dizeyi mevcut bir değer olarak değerlendirir. Bu nedenle boş dize, önceki değerlerin etkin kalmasına izin vermek yerine dış yapılandırmada daha önce kaydedilen sağlayıcılardan gelen değerleri geçersiz kılar.

Bu değişiklik, .NET 10'da Yapılandırmada korunan Null değerleri ile oluşturulan boş değerler ve null yapılandırma değerleri arasındaki ayrımı sürdürmektedir. null işlemenin zincirleme yapılandırma tarafından ele alınışı değişmemiştir.

Sürüm kullanıma sunulmuştur

.NET 11 RC 1

Önceki davranış

ChainedConfigurationProvider.TryGet boş bir dizeyi bulunamadı olarak bildirdi. Sonuç olarak, zincirlenmiş yapılandırmadaki boş bir değer önceki bir sağlayıcı tarafından sağlanan bir değeri geçersiz kılmadı:

using System;
using System.Collections.Generic;
using Microsoft.Extensions.Configuration;

IConfiguration inner = new ConfigurationBuilder()
    .AddInMemoryCollection(new Dictionary<string, string?>
    {
        ["Endpoint"] = "",
    })
    .Build();

IConfiguration configuration = new ConfigurationBuilder()
    .AddInMemoryCollection(new Dictionary<string, string?>
    {
        ["Endpoint"] = "https://example.com",
    })
    .AddConfiguration(inner)
    .Build();

Console.WriteLine($"Endpoint: '{configuration["Endpoint"]}'");

.NET 11 öncesinde, çıktı şöyleydi:

Endpoint: 'https://example.com'

Daha önce bir değer olmadığında, anahtar okunduğunda null döndürülüyordu ve tek değeri zincirlenmiş boş dize olan bölümün mevcut olmadığı kabul ediliyordu.

Yeni davranış

.NET 11'den başlayarak, ChainedConfigurationProvider.TryGet boş bir dizeyi bulundu olarak bildirir. Yukarıdaki örnekte, inner öğesinin boş değeri önceki değeri geçersiz kılar ve çıkış şöyle olur:

Endpoint: ''

Değeri boş dize olan bir bölümün mevcut olduğu kabul edilir. Bağlama, önceki sağlayıcının değeri yerine boş değeri de gözlemler. Örneğin, önceki bir sayısal değerin üzerindeki boş bir dizeyi bir tamsayı özelliğine bağlamak, doğrudan eklenen bir sağlayıcı tarafından sağlanan boş bir değerle tutarlı olarak InvalidOperationException hatası fırlatır.

Sarmalanan null içindeki null değeri, IConfiguration dizin oluşturucusu değeri IConfiguration olan bir anahtarla eksik bir anahtarı ayırt edemediğinden, eksik olarak değerlendirilmeye devam eder.

Kesinti yaratan değişiklik türü

Bu değişiklik davranışsal bir değişikliktir.

Değişiklik nedeni

Boş dize geçerli bir yapılandırma değeridir. Bunun eksik sayılması, doğrudan eklenen yapılandırma sağlayıcılarıyla zincirleme yapılandırmayı tutarsız hale getirdi ve uygulamaların bir ayarı boş bir dizeyle geçersiz kılarak kasıtlı olarak temizlemesini veya devre dışı bırakmasını engelledi. Yeni davranış, yapılandırma sağlayıcısının boş bir değerle eksik değer arasındaki ayrımını korur. Daha fazla bilgi için bkz. dotnet/runtime#131480.

Boş bir dize önceki bir değeri geçersiz kılmaya yönelikse hiçbir eylem gerekmez.

Uygulamanız zincirlenmiş yapılandırmadaki boş bir dizeye dayalıysa ve önceki bir sağlayıcının değerinin kazanmasını sağlıyorsa, bu anahtarı zincirlenmiş yapılandırmadan kaldırın veya yokmuş gibi ya da null olarak gösterin. Zincirlenmiş değerleri dize olmayan türlere bağlayan uygulamalar, hedef tür için boş bir değer geçerli değilse bağlamadan önce boş değerleri doğrulamalı veya normalleştirmelidir. Önceki davranışı geri yüklemek için uyumluluk anahtarı yoktur.

Etkilenen API'ler