Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

.NET 6’da ConfigurationManager Nesnesi

Merhaba,

Bu içeriğimizde .NET 6 ile gelen yeniliklerden birisi olan ve Asp.NET Core 6 için performans açısından oldukça elverişli olan ConfigurationManager nesnesini inceliyor olacağız. Yazımızın seyri boyunca ConfigurationManager‘ın .NET 5’teki muadili olan ConfigurationBuilder nesnesiyle mukayesesini yapacak ve aralarındaki temel farkları değerlendirdikten sonra pratik örnekler eşliğinde içeriğimizi sonlandıracağız. Genel anlamda gidişatımızı resmettiğimize göre fazla vakit kaybetmeden gelin başlayalım…

.NET 5’te Konfigürasyon Yapılanması Nasıldı?

.NET 5, yapılandırma operasyonları için birçok türde nesne sunuyor olsa da bunlar arasından IConfigurationBuilder ve IConfigurationRoot türleri yaygındır.

  • IConfigurationBuilder, konfigürasyon kaynaklarının eklendiği ve Build() metodu ile IConfigurationRoot’u oluşturmamızı sağlayan türdür.
  • IConfigurationRoot, içerisinde konfigürasyon değerlerini barındıran ve okunabilirliği olan nesneyi temsil eden türdür.
.NET 5’te Konfigürasyon Yapılanmasının Sorunu Neydi?

IConfigurationBuilder türü, yukarıda bahsedildiği gibi Build() metodu eşliğinde IConfigurationRoot türünden nesneyi oluşturmaktadır. Haliyle IConfigurationRoot oluşturulduktan sonra IConfigurationBuilder‘a yeni bir yapılandırma yüklendiği taktirde tekrar build edilmesi gerekecek ve böylece yeni üretilen IConfigurationRoot eşliğinde nihai kaynakların bulunduğu yapılandırma elde edilecektir.

const string key = "testKey";

ConfigurationBuilder configurationBuilder = new();
IConfigurationRoot configurationRoot = configurationBuilder.Build();

configurationBuilder.AddInMemoryCollection(new Dictionary<string, string>()
{
    [key] = "value1"
});

configurationRoot = configurationBuilder.Build();
Console.WriteLine(configurationRoot[key]);

configurationBuilder.AddJsonFile("info.json");

configurationRoot = configurationBuilder.Build();
Console.WriteLine(configurationRoot["Profile:Name"]);

Yukarıdaki kod bloğunu incelerseniz eğer 4. satırda build edilen ConfigurationBuilder nesnesine 6. satırda yeni yapılandırma kaynağı yüklenmekte ve böylece 11. satırda tekrar build edilerek yeni kaynaklar kullanılabilmektedir. Benzer mantıkla 14. satırda da ‘info.json’ isimli yapılandırma kaynağı yüklenmekte ve 16. satırda yine build edilerek kullanılabilir hale getirilmektedir.

Yani buradan anlaşılan, ConfigurationBuilder nesnesine her bir yeni kaynak eklendiğinde tekrar tekrar build edilme külfetine katlanılması gerekmektedir.

Asp.NET Core mimarisinde geliştirilen tipik bir uygulamada ise IConfigurationBuilder türü genellikle manuel oluşturularak kullanılmamakta, ilgili nesne perde arkasında build edilerek, uygulama için gerekli IConfigurationRoot türünden yapılandırma nesnesi otomatik olarak oluşturulmaktadır.

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((context, config) =>
            {
                config.AddJsonFile("appsettings.json");
                config.AddEnvironmentVariables();

                if (context.HostingEnvironment.IsProduction())
                {
                    IConfigurationRoot configurationRoot = config.Build();
                    string keyVaultName = configurationRoot["KeyVaultName"];
                    SecretClient secretClient = new(new Uri($"https://{keyVaultName}.vault.azure.net/"),
                        new DefaultAzureCredential());
                    config.AddAzureKeyVault(secretClient, new KeyVaultSecretManager());
                }
            })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

İşte bu olağan süreçte, bizler yukarıdaki gibi kısmi yapılandırma dosyalarını sisteme dahil etmek isteyebilir(5. satır) ve bunun için IConfigurationBuilder nesnesinin Build() metodunu 10. satırdaki gibi manuel tetikleyerek IConfigurationRoot türünden nesneyi elimizle oluşturabiliriz. Böylece manuel build edilen IConfigurationBuilder bir de ayriyeten mimari tarafından otomatik build edileceğinden dolayı yersiz ve gereksiz bir şekilde fazladan işlem gerçekleştirilecek ve bu durumda performansı negatif etkilerken, nihai maliyete artış olarak yansıyacaktır.

.NET 6 İle Gelen ConfigurationManager Nesnesinin Getirisi Nedir?

.NET 5’te ki IConfigurationBuilder türüne alternatif olarak, .NET 6’da Microsoft.Extensions.Configuration namespace’i altında ConfigurationManager nesnesi sunulmuştur. Bu nesne, hem IConfigurationBuilder hem de IConfigurationRoot arayüzlerini uygulamakta ve böylece her iki arayüzü tek bir türde birleştirmektedir.

const string key = "testKey";

ConfigurationManager configurationManager = new();

configurationManager.AddInMemoryCollection(new Dictionary<string, string>()
{
    [key] = "value1"
});

Console.WriteLine(configurationManager[key]);

configurationManager.AddJsonFile("./info.json");

Console.WriteLine(configurationManager["Profile:Name"]);

ConfigurationManager sınıfı, bir konfigürasyon kaynağını eklendiği anda direkt olarak provider’a yüklemekte ve build etme zorunluluğunu önlemektedir.

Haliyle Asp.NET Core 6 uygulamalarında da ConfigureAppConfiguration metodunda direkt olarak ConfigurationManager nesnesi kullanılmakta ve önceki performans kaybı yaşatan durum ortadan kaldırılmış olmaktadır.
.NET 6'da ConfigurationManager Nesnesi

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. 07 Mayıs 2022

    […] eğer ‘appsettings.json’ dosyasındaki konfigürasyonel değerleri okuyabilmek için ConfigurationManager nesnesinden istifade etmekteyiz. Ardından build-in gelen IServiceCollection IoC […]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.