﻿
{"id":26531,"date":"2023-09-10T16:35:56","date_gmt":"2023-09-10T16:35:56","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=26531"},"modified":"2023-09-10T16:35:56","modified_gmt":"2023-09-10T16:35:56","slug":"net-8-webapplication-createbuilder-metodunun-yeni-createslimbuilder-metoduyla-karsilastirilmasi","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/net-8-webapplication-createbuilder-metodunun-yeni-createslimbuilder-metoduyla-karsilastirilmasi\/","title":{"rendered":".NET 8 &#8211; WebApplication.CreateBuilder() Metodunun Yeni CreateSlimBuilder() Metoduyla Kar\u015f\u0131la\u015ft\u0131r\u0131lmas\u0131"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde, bir \u00f6nceki klavyeye alm\u0131\u015f oldu\u011fumuz <a href=\"https:\/\/www.gencayyildiz.com\/blog\/net-8-minimal-api-ahead-of-timeaot-compilation-template\/\" rel=\"noopener\" target=\"_blank\">.NET 8 \u2013 Minimal API Ahead of Time(AOT) Compilation Template<\/a> ba\u015fl\u0131kl\u0131 makalemizde inceledi\u011fimiz AOT Compilation senaryolar\u0131n\u0131 desteklemek i\u00e7in .NET 8&#8217;de tan\u0131t\u0131lm\u0131\u015f olan <code>WebApplication.CreateSlimBuilder(args)<\/code> metodunu derinlemesine inceliyor ve de\u011ferlendiriyor olaca\u011f\u0131z. O halde fazla zaman kaybetmeksizin buyurun ba\u015flayal\u0131m&#8230;<\/p>\n<h3>CreateSlimBuilder Metodu Nedir? Neden \u0130htiyac\u0131m\u0131z Vard\u0131r?<\/h3>\n<p>Yukar\u0131daki sat\u0131rlarda referans etti\u011fimiz bir \u00f6nceki makalemizde Minimal API&#8217;lar i\u00e7in AOT template&#8217;\u0131n\u0131 incelemi\u015ftik. \u0130lgili template&#8217;te, builder nesnesi olarak &#8216;WebApplication&#8217; s\u0131n\u0131f\u0131n\u0131n <code>CreateBuilder<\/code> metodu yerine a\u015fa\u011f\u0131daki gibi <code>CreateSlimBuilder<\/code> metodunun kullan\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6rm\u00fc\u015ft\u00fck.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = WebApplication.CreateSlimBuilder(args);\r\n.\r\n.\r\n.\r\n<\/pre>\n<\/div>\n<p><em><strong>Peki bu metodun di\u011ferinden fark\u0131 nedir?<\/strong><\/em> diye sordu\u011funuzu duyar gibiyim&#8230; Bu soruya cevap verebilmem i\u00e7in \u00f6ncelikle AOT compilation neticesinin, JIT compilation&#8217;a nazaran daha b\u00fcy\u00fck boyutlu bir \u00e7\u0131kt\u0131 \u00fcretti\u011fini hat\u0131rlamam\u0131z gerekmektedir. Hat\u0131rlamam\u0131z gerekmektedir diyorum \u00e7\u00fcnk\u00fc bir \u00f6nceki yaz\u0131da bu ve buna benzer bir\u00e7ok detaya temas etmi\u015ftik.<\/p>\n<p>Velhas\u0131l, AOT derlemesini kulland\u0131\u011f\u0131m\u0131z uygulamalarda b\u00fcy\u00fck boyutlu \u00e7\u0131kt\u0131lar\u0131n yarataca\u011f\u0131 maliyeti ortadan kald\u0131rabilmek i\u00e7in framework&#8217;den ve uygulaman\u0131n kendisinden kullan\u0131lmayan t\u00fcm par\u00e7alar\u0131n\u0131n \u00fcretilecek \u00e7\u0131kt\u0131dan k\u0131rp\u0131lmas\u0131n\u0131 sa\u011flamam\u0131z, nihai olarak \u00fcretilecek \u00e7\u0131kt\u0131n\u0131n boyutunu \u00f6nemli \u00f6l\u00e7\u00fcde azaltacak ve uygulamay\u0131 olmas\u0131 gereken, en ideal\/makul binary boyuta getirmemize yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<p>\u0130\u015fte bizler bu fazlal\u0131k par\u00e7alardan \u00fcretilecek \u00e7\u0131kt\u0131n\u0131n k\u0131rp\u0131lmas\u0131 i\u015flemini <code>CreateSlimBuilder<\/code> metodu ile ger\u00e7ekle\u015ftirebiliriz. <code>CreateSlimBuilder<\/code> metodu, AOT ile uyumlu olmayan veya serverless ve cloud application gibi AOT&#8217;nin \u00f6ne \u00e7\u0131kt\u0131\u011f\u0131 uygulamalar i\u00e7in daha az kullan\u0131\u015fl\u0131 olan bir dizi \u00f6zelli\u011fi kald\u0131rarak, uygulaman\u0131n daha yal\u0131n bir \u015fekilde derlenmesini sa\u011flayarak k\u00fc\u00e7\u00fck boyutlu bir \u00e7\u0131kt\u0131 elde etmemize imkan tan\u0131yan yeni nesil bir fonksiyondur.<\/p>\n<p><code>CreateSlimBuilder<\/code>, <code>CreateBuilder<\/code> fonksiyonunda oldu\u011fu gibi uygulaman\u0131n ba\u015flat\u0131lmas\u0131n\u0131 sa\u011flamaktad\u0131r amma velakin <code>CreateBuilder<\/code>&#8216;a nazaran, uygulamay\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in gereken minimum \u00f6zellikleri baz alarak bu ba\u015flatma i\u015flemine odaklanmaktad\u0131r. Eee haliyle bu durumda, <code>CreateBuilder<\/code> metodundaki klasik seyre kar\u015f\u0131n bir\u00e7ok \u015feyin\/ad\u0131m\u0131n eksik yahut de\u011fi\u015fti\u011fi anlam\u0131na gelmektedir.<\/p>\n<h3>CreateSlimBuilder&#8217;da CreateBuilder&#8217;a Nazaran Neler De\u011fi\u015fmi\u015ftir? Neler Eksiktir?<\/h3>\n<p><code>CreateSlimBuilder<\/code> metodunda;<\/p>\n<ul>\n<li>Hosting Startup Assemblies dedi\u011fimiz, uygulaman\u0131n ba\u015flat\u0131lmas\u0131 ve yap\u0131land\u0131r\u0131lmas\u0131 i\u00e7in kullan\u0131lan \u00f6zel derlemelerin hi\u00e7biri bu metotta bulunmamaktad\u0131r. Bu derlemeler, Asp.NET Core uygulamas\u0131n\u0131n runtime&#8217;\u0131nda ba\u015flatma s\u0131ras\u0131nda belirli i\u015flemleri ger\u00e7ekle\u015ftirmek veya uygulaman\u0131n davran\u0131\u015f\u0131n\u0131 yap\u0131land\u0131rmak i\u00e7in kullan\u0131lan; dependency injection, middleware, configuration vs. gibi yap\u0131land\u0131rmalar\u0131 bar\u0131nd\u0131rmaktad\u0131r. Haliyle <code>CreateSlimBuilder<\/code> metodu sayesinde bu \u00f6zelliklerin hemen hemen hepsi derleme neticesinden t\u00f6rp\u00fclenmektedir.<\/li>\n<li>EventLog log provider, Debug provider ve EventSource provider gibi bir\u00e7ok logging provider yoktur.<\/li>\n<li>Uygulamadaki statik varl\u0131klar\u0131n y\u00fcklenmesine y\u00f6nelik <code>UseStaticFiles<\/code> gibi destekler yoktur.<\/li>\n<li>IIS entegrasyonu bulunmamaktad\u0131r.<\/li>\n<li>HTTPS deste\u011fi bulunmamaktad\u0131r.<\/li>\n<li>H\u0131zl\u0131 HTTP\/3 deste\u011fi bulunmamaktad\u0131r.<\/li>\n<li>.vs<\/li>\n<\/ul>\n<p>Burada IIS deste\u011fi, HTTPS, HTTP\/3 ve <code>UseStaticFiles<\/code> vs. gibi \u00f6zelliklerin kald\u0131r\u0131lmas\u0131n\u0131n nedeni, AOT&#8217;nin hedefledi\u011fi cloud, serverless ve Linux environment gibi senaryolarda genellikle kullan\u0131lmamalar\u0131d\u0131r diyebiliriz.<\/p>\n<p>Tabi kald\u0131r\u0131lan bu \u00f6zelliklerden baz\u0131lar\u0131n\u0131 tekrar eklemek isterseniz bunu a\u015fa\u011f\u0131daki gibi yapabilirsiniz;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\nbuilder.WebHost.UseKestrelHttpsConfiguration();\r\n.\r\n.\r\n.\r\nbuilder.WebHost.ConfigureLogging((webHostBuilderContext, loggingBuilder) =&gt;\r\n{\r\n    loggingBuilder.AddProvider(new MyCustomLoggerProvider());\r\n});\r\n.\r\n.\r\n.\r\n<\/pre>\n<\/div>\n<p>Misal olarak yukar\u0131daki \u00f6rnek kod blo\u011funda, uygulamaya HTTPS deste\u011fi e\u015fli\u011finde logging provider y\u00fcklenmesi \u00f6rneklendirilmi\u015ftir.<\/p>\n<h3>CreateSlimBuilder Nas\u0131l Implemente Edilmi\u015ftir?<\/h3>\n<p>\u015eimdi <code>CreateSlimBuilder<\/code> metodunu, mevcut olan <code>CreateBuilder<\/code> metoduyla kar\u015f\u0131la\u015ft\u0131rarak, nas\u0131l implemente edildi\u011fini inceleyelim.<\/p>\n<p>Malumunuz <a href=\"https:\/\/www.gencayyildiz.com\/blog\/net-6-webapplicationbuilderi-inceleyelim\/\" rel=\"noopener\" target=\"_blank\">WebApplicationBuilder<\/a>, .NET Core&#8217;un \u00f6nceki s\u00fcr\u00fcmlerinde sunulan <code>IHostBuilder<\/code> ve <code>IWebHostBuilder<\/code> interface&#8217;lerinin \u00fczerine in\u015fa edilerek, .NET 6 ile gelmi\u015fti. Yani \u00f6nceki s\u00fcr\u00fcmdeki kullan\u0131ma yine olduk\u00e7a benzerlik g\u00f6stermekteydi. Ee benzer mant\u0131kla <code>CreateSlimBuilder<\/code>&#8216;da <code>CreateBuilder<\/code>&#8216;a \u00e7ok benzerlik g\u00f6stermekte ve geriye <code>WebApplicationBuilder<\/code> nesnesi d\u00f6nd\u00fcrmektedir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\npublic sealed class WebApplication : IHost, IApplicationBuilder, IEndpointRouteBuilder, IAsyncDisposable\r\n{\r\n    .\r\n    .\r\n    .\r\n    public static WebApplicationBuilder CreateBuilder(string&#x5B;] args) =&gt;\r\n        new(new() { Args = args });\r\n    .\r\n    .\r\n    .\r\n    public static WebApplicationBuilder CreateSlimBuilder(string&#x5B;] args) =&gt;\r\n        new(new() { Args = args }, slim: true);\r\n    .\r\n    .\r\n    .\r\n}\r\n\r\n<\/pre>\n<\/div>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere, bu metotlar\u0131n tek k\u00fc\u00e7\u00fck n\u00fcans\u0131 <code>WebApplicationBuilder<\/code> s\u0131n\u0131f\u0131n\u0131n farkl\u0131 constructor&#8217;lar\u0131n\u0131 \u00e7a\u011f\u0131rmalar\u0131d\u0131r. <code>CreateSlimBuilder<\/code> metoduna bakarsan\u0131z e\u011fer ekstradan bir &#8216;slim&#8217; parametresinin de\u011ferini &#8216;true&#8217; olarak vermekle yetinmektedir. \u015eimdi bizler zahiren bu k\u00fc\u00e7\u00fck dokunu\u015fun bat\u0131ni boyutuna a\u015fa\u011f\u0131daki gibi g\u00f6z atarsak e\u011fer biraz \u015fa\u015f\u0131rt\u0131c\u0131 \u015fekilde farkl\u0131l\u0131k arz etti\u011fini g\u00f6zlemlemi\u015f olaca\u011f\u0131z.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/09\/NET-8-WebApplication.CreateBuilder-Metodunun-Yeni-CreateSlimBuilder-Metoduyla-Karsilastirilmasi.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/09\/NET-8-WebApplication.CreateBuilder-Metodunun-Yeni-CreateSlimBuilder-Metoduyla-Karsilastirilmasi.gif\" alt=\".NET 8 - WebApplication.CreateBuilder() Metodunun Yeni CreateSlimBuilder() Metoduyla Kar\u015f\u0131la\u015ft\u0131r\u0131lmas\u0131\" width=\"800\" height=\"265\" class=\"aligncenter size-full wp-image-26537\" \/><\/a>Bu g\u00f6r\u00fclen kod fark\u0131n\u0131n nedeni, &#8216;slim&#8217; parametresinin kullan\u0131lmad\u0131\u011f\u0131 constructor&#8217;\u0131n buradaki i\u015flerin \u00e7o\u011funu di\u011fer helper metotlara devretmesinden kaynaklanmaktad\u0131r. &#8216;slim&#8217; parametreli constructor&#8217;da ise ihtiya\u00e7 duyulmayan \u00f6zelliklerin \u00e7\u0131kar\u0131lmas\u0131 durumu s\u00f6z konusudur. Ha koda \u015f\u00f6yle g\u00f6z atarsan\u0131z e\u011fer esas\u0131nda iki ana de\u011fi\u015fikli\u011fin var oldu\u011funu g\u00f6receksiniz;<\/p>\n<ul>\n<li>\n&#8216;slim&#8217; parametreli constructor&#8217;da <code>new HostApplicationBuilder(...)<\/code> yerine <code>CreateEmptyApplicationBuilder()<\/code> metodu \u00e7a\u011fr\u0131lmaktad\u0131r.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    internal WebApplicationBuilder(WebApplicationOptions options, Action&lt;IHostBuilder&gt;? configureDefaults = null)\r\n    {\r\n        .\r\n        .\r\n        .\r\n        _hostApplicationBuilder = new HostApplicationBuilder(new HostApplicationBuilderSettings\r\n        {\r\n            Args = options.Args,\r\n            ApplicationName = options.ApplicationName,\r\n            EnvironmentName = options.EnvironmentName,\r\n            ContentRootPath = options.ContentRootPath,\r\n            Configuration = configuration,\r\n        });\r\n        .\r\n        .\r\n        .\r\n    }\r\n<\/pre>\n<\/div>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    internal WebApplicationBuilder(WebApplicationOptions options, bool slim, Action&lt;IHostBuilder&gt;? configureDefaults = null)\r\n    {\r\n        .\r\n        .\r\n        .\r\n        _hostApplicationBuilder = Microsoft.Extensions.Hosting.Host.CreateEmptyApplicationBuilder(new HostApplicationBuilderSettings\r\n        {\r\n            Args = options.Args,\r\n            ApplicationName = options.ApplicationName,\r\n            EnvironmentName = options.EnvironmentName,\r\n            ContentRootPath = options.ContentRootPath,\r\n            Configuration = configuration,\r\n        });\r\n        .\r\n        .\r\n        .\r\n    }\r\n<\/pre>\n<\/div>\n<\/li>\n<li>Yine &#8216;slim&#8217; parametreli constructor&#8217;da <code>ConfigureWebHostDefaults<\/code> metodu yerine <code>ConfigureSlimWebHost<\/code> metodu \u00e7a\u011fr\u0131lmaktad\u0131r.\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    internal WebApplicationBuilder(WebApplicationOptions options, Action&lt;IHostBuilder&gt;? configureDefaults = null)\r\n    {\r\n        .\r\n        .\r\n        .\r\n        bootstrapHostBuilder.ConfigureWebHostDefaults(webHostBuilder =&gt;\r\n        {\r\n            \/\/ Runs inline.\r\n            webHostBuilder.Configure(ConfigureApplication);\r\n\r\n            InitializeWebHostSettings(webHostBuilder);\r\n        },\r\n        options =&gt;\r\n        {\r\n            \/\/ We've already applied &quot;ASPNETCORE_&quot; environment variables to hosting config\r\n            options.SuppressEnvironmentConfiguration = true;\r\n        });\r\n        .\r\n        .\r\n        .\r\n    }\r\n<\/pre>\n<\/div>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    internal WebApplicationBuilder(WebApplicationOptions options, bool slim, Action&lt;IHostBuilder&gt;? configureDefaults = null)\r\n    {\r\n        .\r\n        .\r\n        .\r\n        bootstrapHostBuilder.ConfigureSlimWebHost(\r\n            webHostBuilder =&gt;\r\n            {\r\n                AspNetCore.WebHost.ConfigureWebDefaultsSlim(webHostBuilder);\r\n\r\n                \/\/ Runs inline.\r\n                webHostBuilder.Configure(ConfigureApplication);\r\n\r\n                InitializeWebHostSettings(webHostBuilder);\r\n            },\r\n            options =&gt;\r\n            {\r\n                \/\/ We've already applied &quot;ASPNETCORE_&quot; environment variables to hosting config\r\n                options.SuppressEnvironmentConfiguration = true;\r\n            });\r\n        .\r\n        .\r\n        .\r\n    }\r\n<\/pre>\n<\/div>\n<\/li>\n<\/ul>\n<p>Bu kodlardaki yap\u0131lan farklar\u0131 tam olarak anlayabilmek i\u00e7in GitHub \u00fczerinden t\u00fcm kodlara uzun uzad\u0131ya g\u00f6z atmakta fayda vard\u0131r. Biz <code>CreateSlimBuilder<\/code> metodunun varl\u0131k sebebini ve zaten mevcudiyette olan <code>CreateBuilder<\/code>&#8216;a nazaran hangi farklar\u0131 getirdi\u011fini masaya yat\u0131rmakla yetinecek ve bu i\u00e7eri\u011fimizi burada noktalayaca\u011f\u0131z.<\/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, bir \u00f6nceki klavyeye alm\u0131\u015f oldu\u011fumuz .NET 8 \u2013 Minimal API Ahead of Time(AOT) Compilation Template ba\u015fl\u0131kl\u0131 makalemizde inceledi\u011fimiz AOT Compilation senaryolar\u0131n\u0131 desteklemek i\u00e7in .NET 8&#8217;de tan\u0131t\u0131lm\u0131\u015f olan WebApplication.CreateSlimBuilder(args) metodunu derinlemesine inceliyor&#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":26539,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4912],"tags":[4917,4929],"class_list":["post-26531","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-8","tag-aot-compilation","tag-createslimbuilder"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26531","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=26531"}],"version-history":[{"count":6,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26531\/revisions"}],"predecessor-version":[{"id":26538,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26531\/revisions\/26538"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/26539"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=26531"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=26531"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=26531"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}