﻿
{"id":26540,"date":"2023-09-13T11:24:21","date_gmt":"2023-09-13T11:24:21","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=26540"},"modified":"2023-09-13T11:24:21","modified_gmt":"2023-09-13T11:24:21","slug":"net-8-minimap-api-source-generatori-inceleyelim","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/net-8-minimap-api-source-generatori-inceleyelim\/","title":{"rendered":".NET 8 &#8211; Minimap API Source Generator&#8217;\u0131 \u0130nceleyelim"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde .NET 8 ile gelmesi beklenen, AOT i\u015f y\u00fcklerini(workloads) desteklemek i\u00e7in tan\u0131t\u0131lm\u0131\u015f olan <em>Minimal API Source Generator<\/em>&#8216;\u0131 inceliyor olaca\u011f\u0131z. O halde hi\u00e7 vakit kaybetmeden buyurun ba\u015flayal\u0131m&#8230;<\/p>\n<h3>Minimal API&#8217;lar Nas\u0131l \u00c7al\u0131\u015f\u0131rlar?<\/h3>\n<p>Malumunuz, Asp.NET Core mimarisinde uygulaman\u0131n ba\u015flang\u0131\u00e7 deneyimini daha minimum bir seviyeye \u00e7ekebilmek i\u00e7in .NET 6&#8217;da Minimal API&#8217;lar tan\u0131t\u0131lm\u0131\u015ft\u0131. Minimal API&#8217;lardan \u00f6nce bir Asp.NET Core uygulamas\u0131n\u0131 aya\u011fa kald\u0131rabilmek i\u00e7in hi\u00e7 yoktan &#8216;Program.cs&#8217; ile herhangi bir controller s\u0131n\u0131f\u0131 \u00fczerinde birden fazla kural e\u015fli\u011finde bir \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftirmemiz gerekiyordu. Minimal API&#8217;lar sayesinde buradaki komplekslik olabildi\u011fince sadele\u015ftirilerek controller s\u0131n\u0131flar\u0131na ihtiya\u00e7 duyulmaks\u0131z\u0131n direkt olarak &#8216;Program.cs&#8217; i\u00e7erisinde action&#8217;lar\u0131 tasarlayabilme imkan\u0131 elde etmi\u015f bulunuyoruz.<\/p>\n<p>Misal olarak Minimal API&#8217;lar ile basit bir &#8216;Merhaba d\u00fcnya&#8217; \u00e7al\u0131\u015fmas\u0131 yapmak istiyorsak e\u011fer a\u015fa\u011f\u0131daki gibi bir kod in\u015fa etmemiz yeterli olacakt\u0131r.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = WebApplication.CreateBuilder(args);\r\nvar app = builder.Build();\r\n\r\napp.MapGet(&quot;\/&quot;, () =&gt; &quot;Merhaba d\u00fcnya...&quot;);\r\n\r\napp.Run();\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/09\/NET-8-Minimap-API-Source-Generatori-Inceleyelim.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/09\/NET-8-Minimap-API-Source-Generatori-Inceleyelim.png\" alt=\".NET 8 - Minimap API Source Generator&#039;\u0131 \u0130nceleyelim\" width=\"286\" height=\"101\" class=\"aligncenter size-full wp-image-26542\" \/><\/a>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere olduk\u00e7a basit bir \u015fekilde, 4 sat\u0131r e\u015fli\u011finde bir Asp.NET Core uygulamas\u0131n\u0131 rahatl\u0131kla aya\u011fa kald\u0131rabiliyor ve mimarinin konfig\u00fcrasyonlar\u0131yla vakit kaybetmeksizin direkt operasyonlar\u0131m\u0131za odaklanarak, \u00e7al\u0131\u015fmalar\u0131m\u0131z\u0131 y\u00fcr\u00fctebiliyoruz.<\/p>\n<p>Evet, bu yap\u0131lanma sizlerin de kat\u0131laca\u011f\u0131 \u00fczere olduk\u00e7a pratik ve etkili olsa da ne yaz\u0131k ki .NET 8&#8217;de bir sorun te\u015fkil etmektedir ki, o da, AOT ile normal Minimal API&#8217;lar\u0131n uyumsuz olmas\u0131d\u0131r. Minimal API&#8217;lar da AOT derlemesini ger\u00e7ekle\u015ftirmek istiyorsan\u0131z yak\u0131n zamanda 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\">Minimal API Ahead of Time(AOT) Compilation Template<\/a> ba\u015fl\u0131kl\u0131 makalemizden de hat\u0131rlayaca\u011f\u0131n\u0131z \u00fczere AOT template&#8217;i \u00fczerinden \u00e7al\u0131\u015fman\u0131z\u0131 yap\u0131land\u0131rman\u0131z gerekmektedir.<\/p>\n<h3>Neden Bir Source Generator&#8217;a \u0130htiyac\u0131m\u0131z Var?<\/h3>\n<p>Ahead of Time(AOT) compilation, .NET 8&#8217;de ba\u015fl\u0131ca \u00fczerinde odaklan\u0131lm\u0131\u015f \u00f6zelliklerden birisidir diyebiliriz. Malumunuz, AOT ile derlenmi\u015f .NET uygulamalar\u0131nda Just in Time(JIT) compilation yoktur ve t\u00fcm derleme compile time&#8217;da ger\u00e7ekle\u015ftirilmektedir. Bunun, uygulaman\u0131n ba\u015flang\u0131\u00e7 s\u00fcresi a\u00e7\u0131s\u0131ndan avantaj sa\u011flad\u0131\u011f\u0131n\u0131 bildi\u011fimiz gibi uygun olmayan noktalarda ister istemez dezavantajlar\u0131 oldu\u011funu da bilmekteyiz. Misal olarak; JIT&#8217;in olmamas\u0131 demek &#8216;Plugin Architecture&#8217; tabanl\u0131 uygulamalar\u0131n olmamas\u0131 demektir.<\/p>\n<p>.NET 8&#8217;de minimal api&#8217;leri AOT ile uyumlu hale getirebilmek i\u00e7in source generator&#8217;lar\u0131 kullanabilece\u011fimiz farkl\u0131 bir yakla\u015f\u0131m sergilememiz gereklidir. <strong><em>Peki bu ne demektir?<\/em><\/strong>, yani bizler a\u015fa\u011f\u0131daki gibi zaten minimal api&#8217;lar\u0131 tan\u0131mlayabiliyor ve kullanabiliyoruz;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napp.MapGet(&quot;\/&quot;, () =&gt; &quot;Merhaba d\u00fcnya...&quot;);\r\napp.MapGet(&quot;\/{name}&quot;, (string name) =&gt; $&quot;Merhaba {name}...&quot;);\r\n<\/pre>\n<\/div>\n<p>Birazdan g\u00f6rece\u011fiz ki, AOT&#8217;yi hedefleyen source generator&#8217;lar\u0131n genel tasar\u0131m\u0131, \u00e7a\u011f\u0131rd\u0131\u011f\u0131n\u0131z\u0131 d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcn\u00fcz metodu AOT&#8217;ye daha uygun olan farkl\u0131 bir metotla de\u011fi\u015ftirmesi \u00fczerine kuruludur. B\u00f6ylece AOT dostu metotlar olu\u015fturulmakta ve reflection tabanl\u0131 API&#8217;lara nazaran bunlar tercih edilmektedir.<\/p>\n<h3>Minimal API Source Generator&#8217;\u0131 Etkinle\u015ftirme<\/h3>\n<p>Minimal api source generator&#8217;\u0131n temel amac\u0131 AOT dostu olmakt\u0131r. Bunun i\u00e7in yap\u0131lmas\u0131 gereken, uygulamada &#8216;PublishAot&#8217; \u00f6zelli\u011fini <code>&lt;PublishAot&gt;true&lt;\/PublishAot&gt;<\/code> \u015feklinde etkinle\u015ftirmektir. Bu yap\u0131land\u0131rma neticesinde source generator uygulamada otomatik olarak aktifle\u015ftirilmi\u015f olacakt\u0131r.<\/p>\n<p>AOT a\u00e7\u0131k\u00e7a source generator&#8217;\u0131n ana odak noktas\u0131d\u0131r lakin AOT kullanmas\u0131n\u0131z bile ba\u015flang\u0131\u00e7 zaman\u0131 a\u00e7\u0131s\u0131ndan iyile\u015ftirmeleri g\u00f6rebilirsiniz. Minimal api&#8217;ler, her handler&#8217;\u0131n <code>RequestDelegate<\/code> kodunu runtime&#8217;da dinamik olarak olu\u015fturmak yerine, source generator ile bunu \u00f6nceden de yapabilirler ve b\u00f6ylece ba\u015flang\u0131\u00e7 ve ilk istek s\u00fcrelerini h\u0131zland\u0131rabilirler. Bunun i\u00e7in .csproj dosyas\u0131nda <code>&lt;EnableRequestDelegateGenerator&gt;true&lt;\/EnableRequestDelegateGenerator&gt;<\/code> yap\u0131land\u0131rmas\u0131 e\u015fli\u011finde minimal api&#8217;lar da source generator&#8217;\u0131 etkinle\u015ftirebilirsiniz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&lt;Project Sdk=&quot;Microsoft.NET.Sdk.Web&quot;&gt;\r\n\t&lt;PropertyGroup&gt;\r\n\t\t&lt;TargetFramework&gt;net8.0&lt;\/TargetFramework&gt;\r\n\t\t&lt;Nullable&gt;enable&lt;\/Nullable&gt;\r\n\t\t&lt;ImplicitUsings&gt;enable&lt;\/ImplicitUsings&gt;\r\n\t\t&lt;InvariantGlobalization&gt;true&lt;\/InvariantGlobalization&gt;\r\n\t\t&lt;EnableRequestDelegateGenerator&gt;true&lt;\/EnableRequestDelegateGenerator&gt;\r\n\t&lt;\/PropertyGroup&gt;\r\n\t.\r\n\t.\r\n\t.\r\n&lt;\/Project&gt;\r\n<\/pre>\n<\/div>\n<p>\u0130\u015fte bu kadar! <\/p>\n<p>Kulland\u0131\u011f\u0131m\u0131z bu source generator yap\u0131lanmas\u0131 sayesinde \u00e7al\u0131\u015fma zaman\u0131ndan ziyade derleme zaman\u0131nda kod \u00fcretilmekte ve b\u00f6ylece runtime&#8217;da ki i\u015f y\u00fck\u00fcn\u00fc daha da azaltabilmekteyiz. Bu pek b\u00fcy\u00fck bir fark yaratmayacakt\u0131r belki ama, misal olarak serverless gibi uygulamalarda tam AOT&#8217;ye ge\u00e7emedi\u011finiz durumlarda illaki yarar\u0131 olaca\u011f\u0131 kanaatindeyiz.<\/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 8 ile gelmesi beklenen, AOT i\u015f y\u00fcklerini(workloads) desteklemek i\u00e7in tan\u0131t\u0131lm\u0131\u015f olan Minimal API Source Generator&#8216;\u0131 inceliyor olaca\u011f\u0131z. O halde hi\u00e7 vakit kaybetmeden buyurun ba\u015flayal\u0131m&#8230; Minimal API&#8217;lar Nas\u0131l \u00c7al\u0131\u015f\u0131rlar? Malumunuz, Asp.NET&#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":[4915,4930,4931],"class_list":["post-26540","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-8","tag-net-8","tag-minimal-api","tag-source-generator"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26540","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=26540"}],"version-history":[{"count":7,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26540\/revisions"}],"predecessor-version":[{"id":26550,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26540\/revisions\/26550"}],"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=26540"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=26540"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=26540"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}