﻿
{"id":23938,"date":"2021-11-28T23:43:57","date_gmt":"2021-11-28T23:43:57","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=23938"},"modified":"2021-11-28T23:43:57","modified_gmt":"2021-11-28T23:43:57","slug":"net-6da-configurationmanager-nesnesi","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/net-6da-configurationmanager-nesnesi\/","title":{"rendered":".NET 6&#8217;da ConfigurationManager Nesnesi"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde .NET 6 ile gelen yeniliklerden birisi olan ve Asp.NET Core 6 i\u00e7in performans a\u00e7\u0131s\u0131ndan olduk\u00e7a elveri\u015fli olan <em>ConfigurationManager<\/em> nesnesini inceliyor olaca\u011f\u0131z. Yaz\u0131m\u0131z\u0131n seyri boyunca <em>ConfigurationManager<\/em>&#8216;\u0131n .NET 5&#8217;teki muadili olan <em>ConfigurationBuilder<\/em> nesnesiyle mukayesesini yapacak ve aralar\u0131ndaki temel farklar\u0131 de\u011ferlendirdikten sonra pratik \u00f6rnekler e\u015fli\u011finde i\u00e7eri\u011fimizi sonland\u0131raca\u011f\u0131z. Genel anlamda gidi\u015fat\u0131m\u0131z\u0131 resmetti\u011fimize g\u00f6re fazla vakit kaybetmeden gelin ba\u015flayal\u0131m&#8230;<\/p>\n<h6>.NET 5&#8217;te Konfig\u00fcrasyon Yap\u0131lanmas\u0131 Nas\u0131ld\u0131?<\/h6>\n<p>.NET 5, yap\u0131land\u0131rma operasyonlar\u0131 i\u00e7in bir\u00e7ok t\u00fcrde nesne sunuyor olsa da bunlar aras\u0131ndan <em>IConfigurationBuilder<\/em> ve <em>IConfigurationRoot<\/em> t\u00fcrleri yayg\u0131nd\u0131r.<\/p>\n<ul>\n<li><em style=\"color:orange;\">IConfigurationBuilder<\/em>, konfig\u00fcrasyon kaynaklar\u0131n\u0131n eklendi\u011fi ve <code style=\"color:red;font-size:14px;\">Build()<\/code> metodu ile IConfigurationRoot&#8217;u olu\u015fturmam\u0131z\u0131 sa\u011flayan t\u00fcrd\u00fcr.<\/li>\n<li><em style=\"color:orange;\">IConfigurationRoot<\/em>, i\u00e7erisinde konfig\u00fcrasyon de\u011ferlerini bar\u0131nd\u0131ran ve okunabilirli\u011fi olan nesneyi temsil eden t\u00fcrd\u00fcr.<\/li>\n<\/ul>\n<h6>.NET 5&#8217;te Konfig\u00fcrasyon Yap\u0131lanmas\u0131n\u0131n Sorunu Neydi?<\/h6>\n<p><em>IConfigurationBuilder<\/em> t\u00fcr\u00fc, yukar\u0131da bahsedildi\u011fi gibi <code style=\"color:red;font-size:14px;\">Build()<\/code> metodu e\u015fli\u011finde <em>IConfigurationRoot<\/em> t\u00fcr\u00fcnden nesneyi olu\u015fturmaktad\u0131r. Haliyle <em>IConfigurationRoot<\/em> olu\u015fturulduktan sonra <em>IConfigurationBuilder<\/em>&#8216;a yeni bir yap\u0131land\u0131rma y\u00fcklendi\u011fi taktirde tekrar build edilmesi gerekecek ve b\u00f6ylece yeni \u00fcretilen <em>IConfigurationRoot<\/em> e\u015fli\u011finde nihai kaynaklar\u0131n bulundu\u011fu yap\u0131land\u0131rma elde edilecektir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nconst string key = &quot;testKey&quot;;\r\n\r\nConfigurationBuilder configurationBuilder = new();\r\nIConfigurationRoot configurationRoot = configurationBuilder.Build();\r\n\r\nconfigurationBuilder.AddInMemoryCollection(new Dictionary&lt;string, string&gt;()\r\n{\r\n    &#x5B;key] = &quot;value1&quot;\r\n});\r\n\r\nconfigurationRoot = configurationBuilder.Build();\r\nConsole.WriteLine(configurationRoot&#x5B;key]);\r\n\r\nconfigurationBuilder.AddJsonFile(&quot;info.json&quot;);\r\n\r\nconfigurationRoot = configurationBuilder.Build();\r\nConsole.WriteLine(configurationRoot&#x5B;&quot;Profile:Name&quot;]);\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer 4. sat\u0131rda build edilen <em>ConfigurationBuilder<\/em> nesnesine 6. sat\u0131rda yeni yap\u0131land\u0131rma kayna\u011f\u0131 y\u00fcklenmekte ve b\u00f6ylece 11. sat\u0131rda tekrar build edilerek yeni kaynaklar kullan\u0131labilmektedir. Benzer mant\u0131kla 14. sat\u0131rda da &#8216;info.json&#8217; isimli yap\u0131land\u0131rma kayna\u011f\u0131 y\u00fcklenmekte ve 16. sat\u0131rda yine build edilerek kullan\u0131labilir hale getirilmektedir.<\/p>\n<p>Yani buradan anla\u015f\u0131lan, <em>ConfigurationBuilder<\/em> nesnesine her bir yeni kaynak eklendi\u011finde tekrar tekrar build edilme k\u00fclfetine katlan\u0131lmas\u0131 gerekmektedir.<\/p>\n<p>Asp.NET Core mimarisinde geli\u015ftirilen tipik bir uygulamada ise <em>IConfigurationBuilder<\/em> t\u00fcr\u00fc genellikle manuel olu\u015fturularak kullan\u0131lmamakta, ilgili nesne perde arkas\u0131nda build edilerek, uygulama i\u00e7in gerekli <em>IConfigurationRoot<\/em> t\u00fcr\u00fcnden yap\u0131land\u0131rma nesnesi otomatik olarak olu\u015fturulmaktad\u0131r. <\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        public static IHostBuilder CreateHostBuilder(string&#x5B;] args) =&gt;\r\n            Host.CreateDefaultBuilder(args)\r\n            .ConfigureAppConfiguration((context, config) =&gt;\r\n            {\r\n                config.AddJsonFile(&quot;appsettings.json&quot;);\r\n                config.AddEnvironmentVariables();\r\n\r\n                if (context.HostingEnvironment.IsProduction())\r\n                {\r\n                    IConfigurationRoot configurationRoot = config.Build();\r\n                    string keyVaultName = configurationRoot&#x5B;&quot;KeyVaultName&quot;];\r\n                    SecretClient secretClient = new(new Uri($&quot;https:\/\/{keyVaultName}.vault.azure.net\/&quot;),\r\n                        new DefaultAzureCredential());\r\n                    config.AddAzureKeyVault(secretClient, new KeyVaultSecretManager());\r\n                }\r\n            })\r\n                .ConfigureWebHostDefaults(webBuilder =&gt;\r\n                {\r\n                    webBuilder.UseStartup&lt;Startup&gt;();\r\n                });\r\n<\/pre>\n<p>\u0130\u015fte bu ola\u011fan s\u00fcre\u00e7te, bizler yukar\u0131daki gibi k\u0131smi yap\u0131land\u0131rma dosyalar\u0131n\u0131 sisteme dahil etmek isteyebilir(5. sat\u0131r) ve bunun i\u00e7in <em>IConfigurationBuilder<\/em> nesnesinin <code style=\"color:red;font-size:14px;\">Build()<\/code> metodunu 10. sat\u0131rdaki gibi manuel tetikleyerek <em>IConfigurationRoot<\/em> t\u00fcr\u00fcnden nesneyi elimizle olu\u015fturabiliriz. B\u00f6ylece manuel build edilen <em>IConfigurationBuilder<\/em> bir de ayriyeten mimari taraf\u0131ndan otomatik build edilece\u011finden dolay\u0131 yersiz ve gereksiz bir \u015fekilde fazladan i\u015flem ger\u00e7ekle\u015ftirilecek ve bu durumda performans\u0131 negatif etkilerken, nihai maliyete art\u0131\u015f olarak yans\u0131yacakt\u0131r.<\/p>\n<h6>.NET 6 \u0130le Gelen ConfigurationManager Nesnesinin Getirisi Nedir?<\/h6>\n<p>.NET 5&#8217;te ki <em>IConfigurationBuilder<\/em> t\u00fcr\u00fcne alternatif olarak, .NET 6&#8217;da <code>Microsoft.Extensions.Configuration<\/code> namespace&#8217;i alt\u0131nda <em>ConfigurationManager<\/em> nesnesi sunulmu\u015ftur. Bu nesne, hem <em>IConfigurationBuilder<\/em> hem de <em>IConfigurationRoot<\/em> aray\u00fczlerini uygulamakta ve b\u00f6ylece her iki aray\u00fcz\u00fc tek bir t\u00fcrde birle\u015ftirmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nconst string key = &quot;testKey&quot;;\r\n\r\nConfigurationManager configurationManager = new();\r\n\r\nconfigurationManager.AddInMemoryCollection(new Dictionary&lt;string, string&gt;()\r\n{\r\n    &#x5B;key] = &quot;value1&quot;\r\n});\r\n\r\nConsole.WriteLine(configurationManager&#x5B;key]);\r\n\r\nconfigurationManager.AddJsonFile(&quot;.\/info.json&quot;);\r\n\r\nConsole.WriteLine(configurationManager&#x5B;&quot;Profile:Name&quot;]);\r\n<\/pre>\n<p><em>ConfigurationManager<\/em> s\u0131n\u0131f\u0131, bir konfig\u00fcrasyon kayna\u011f\u0131n\u0131 eklendi\u011fi anda direkt olarak provider&#8217;a y\u00fcklemekte ve build etme zorunlulu\u011funu \u00f6nlemektedir.<\/p>\n<p>Haliyle Asp.NET Core 6 uygulamalar\u0131nda da <code>ConfigureAppConfiguration<\/code> metodunda direkt olarak <em>ConfigurationManager<\/em> nesnesi kullan\u0131lmakta ve \u00f6nceki performans kayb\u0131 ya\u015fatan durum ortadan kald\u0131r\u0131lm\u0131\u015f olmaktad\u0131r.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/11\/NET-6da-ConfigurationManager-Nesnesi.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/11\/NET-6da-ConfigurationManager-Nesnesi.png\" alt=\".NET 6&#039;da ConfigurationManager Nesnesi\" width=\"730\" height=\"64\" class=\"aligncenter size-full wp-image-23957\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/11\/NET-6da-ConfigurationManager-Nesnesi.png 730w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/11\/NET-6da-ConfigurationManager-Nesnesi-300x26.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/11\/NET-6da-ConfigurationManager-Nesnesi-720x64.png 720w\" sizes=\"auto, (max-width: 730px) 100vw, 730px\" \/><\/a><\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu i\u00e7eri\u011fimizde .NET 6 ile gelen yeniliklerden birisi olan ve Asp.NET Core 6 i\u00e7in performans a\u00e7\u0131s\u0131ndan olduk\u00e7a elveri\u015fli olan ConfigurationManager nesnesini inceliyor olaca\u011f\u0131z. Yaz\u0131m\u0131z\u0131n seyri boyunca ConfigurationManager&#8216;\u0131n .NET 5&#8217;teki muadili olan ConfigurationBuilder nesnesiyle&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":23959,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4446,4443],"tags":[4449,4458,4459,4457,4460],"class_list":["post-23938","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-6","category-asp-net-core-6-0","tag-net-6","tag-net-6-configurationmanager","tag-configurationbuilder","tag-configurationmanager","tag-configurationroot"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/23938","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=23938"}],"version-history":[{"count":19,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/23938\/revisions"}],"predecessor-version":[{"id":23960,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/23938\/revisions\/23960"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/23959"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=23938"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=23938"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=23938"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}