﻿
{"id":28662,"date":"2026-05-03T21:31:41","date_gmt":"2026-05-03T21:31:41","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=28662"},"modified":"2026-05-03T21:31:57","modified_gmt":"2026-05-03T21:31:57","slug":"aspire-13-2-ile-ai-agentlari-olceklendirme-parallel-development-icin-gelen-izolasyon-katmani","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/aspire-13-2-ile-ai-agentlari-olceklendirme-parallel-development-icin-gelen-izolasyon-katmani\/","title":{"rendered":"Aspire 13.2 \u0130le AI Agent&#8217;lar\u0131 \u00d6l\u00e7eklendirme: Parallel Development \u0130\u00e7in Gelen \u0130zolasyon Katman\u0131"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Aspire, yapay zek\u00e2 destekli geli\u015ftirme d\u00fcnyas\u0131nda ger\u00e7ekten oyunun kurallar\u0131n\u0131 de\u011fi\u015ftiren bir yakla\u015f\u0131m sunmaktad\u0131r. D\u00fc\u015f\u00fcnsenize, tek bir <em>Program.cs<\/em> dosyas\u0131yla, i\u00e7erisinde backend API&#8217;leri, python servisleri, frontend uygulamalar\u0131, veritabanlar\u0131 yahut message queue&#8217;lar\u0131 olan, tamamen orkestre edilmi\u015f ve test edilmeye haz\u0131r, ba\u015ftan sona distributed olan bir sistemi aya\u011fa kald\u0131rabilmekteyiz. Bu \u00f6zellik, agent&#8217;lara ciddi bir g\u00fc\u00e7 kazand\u0131r\u0131yor olsa da i\u015f bununla da bitmemektedir. Aspire&#8217;\u0131n <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tag\/mcp-server\/\" target=\"_blank\">MCP Server<\/a> altyap\u0131s\u0131 sayesinde agent&#8217;lar sistemdeki kaynaklar\u0131n durumunu kod \u00fczerinden sorgulayabilmekte, log&#8217;lara eri\u015febilmekte ve sorunlar\u0131 do\u011frudan analiz edip \u00e7\u00f6zebilmektedir. Yani art\u0131k AI agent&#8217;lar sadece tekil bile\u015fenlerle de\u011fil, t\u00fcm sistemle etkile\u015fime girerek \u00e7al\u0131\u015fabilmektedir. Bu da geli\u015ftirme s\u00fcre\u00e7lerini ciddi anlamda sadele\u015ftirmekle birlikte h\u0131zland\u0131rmaktad\u0131r.<\/p>\n<p>Ancak i\u015f \u00f6l\u00e7eklemeye geldi\u011finde Aspire 13.2 s\u00fcr\u00fcm\u00fcnden \u00f6nce <em>&#8216;port \u00e7ak\u0131\u015fmalar\u0131&#8217;<\/em> gibi kritik bir sorun s\u00f6z konusuydu. Ayn\u0131 anda birden fazla worktree \u00fczerinden Aspire <em>AppHost<\/em> \u00e7al\u0131\u015ft\u0131rmak istendi\u011finde, t\u00fcm instance&#8217;lar ayn\u0131 port&#8217;lar\u0131 kullanmaya \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan, paralel \u00e7al\u0131\u015fan AI agent&#8217;larla geli\u015ftirme yapmak neredeyse imkans\u0131z hale gelmekteydi.<\/p>\n<p>Bu sorunu \u00e7\u00f6zmek i\u00e7in bizler manuel y\u00f6ntemlerin d\u0131\u015f\u0131nda her worktree&#8217;ye \u00f6zel port atamas\u0131 yapan bir izolasyon katman\u0131 geli\u015ftirmeye \u00e7al\u0131\u015f\u0131yor, script&#8217;ler ve ak\u0131ll\u0131 bir MCP proxy kullanarak her instance&#8217;\u0131n birbirinden tamamen ba\u011f\u0131ms\u0131z \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamaya \u00e7al\u0131\u015f\u0131yorduk.<\/p>\n<p>Aspire 13.2 ile birlikte bu problem k\u00f6k\u00fcnden \u00e7\u00f6z\u00fclmekte ve bir <em>AppHost<\/em>&#8216;un birden fazla instance&#8217;\u0131n\u0131 paralel olarak rahatl\u0131kla \u00e7al\u0131\u015ft\u0131rmam\u0131za olanak tan\u0131yan izolasyon modu gelmektedir. Tabi bizler, bu port izolasyonu seviyesine ge\u00e7meden \u00f6nce Aspire&#8217;\u0131n yapay zek\u00e2 agent&#8217;lar\u0131 i\u00e7in neden m\u00fckemmel oldu\u011funun isti\u015faresiyle konuya giri\u015f yapacak ard\u0131ndan bu izolasyon modunu sizlere tan\u0131t\u0131yor olaca\u011f\u0131z&#8230;<\/p>\n<h4>Aspire Yapay Zek\u00e2 Agent&#8217;lar\u0131 \u0130\u00e7in Neden M\u00fckemmeldir?<\/h4>\n<p>Aspire, AI agent&#8217;lar\u0131yla geli\u015ftirme yaparken klasik yakla\u015f\u0131mlar\u0131n \u00f6tesine ge\u00e7memizi sa\u011flar. Bunun temel nedeni, agent&#8217;lara sadece kod yazd\u0131rmakla kalmay\u0131p, t\u00fcm sistemi y\u00f6netebilecek bir yetenek kazand\u0131rmas\u0131d\u0131r.<\/p>\n<p>En kritik avantajlar\u0131ndan biri, yukar\u0131daki sat\u0131rlarda bahsedildi\u011fi \u00fczere tek bir <em>Program.cs<\/em> \u00fczerinden komple bir distributed sistemin aya\u011fa kald\u0131r\u0131labilmesidir. T\u00fcm sistemin merkezi bir noktadan orkestre edilmesi, agent&#8217;lar a\u00e7\u0131s\u0131ndan par\u00e7al\u0131 bir yap\u0131 yerine b\u00fct\u00fcnc\u00fcl bir sistem \u00fczerinden \u00e7al\u0131\u015fma imkan\u0131 sa\u011flamaktad\u0131r. Bu da agent geli\u015ftirme a\u00e7\u0131s\u0131ndan b\u00fcy\u00fck avantaj sa\u011flamaktad\u0131r.<\/p>\n<p>Bir di\u011fer \u00f6nemli nokta ise Aspire&#8217;\u0131n MCP Server yetenekleridir. Bu yap\u0131 sayesinde AI agent&#8217;lar;<\/p>\n<ul style=\"font-size:14px;\">\n<li>Sistem kaynaklar\u0131n\u0131n durumunu programatik olarak sorgulayabilmektedir<\/li>\n<li>Log&#8217;lara eri\u015febilmektedir<\/li>\n<li>Hatalar\u0131 analiz edip \u00e7\u00f6z\u00fcm \u00fcretebilmektedir<\/li>\n<\/ul>\n<p>Yani agent art\u0131k sadece salt olarak kod yazan bir ara\u00e7 de\u011fil; sistemi g\u00f6zlemleyen, anlayan ve gerekti\u011finde m\u00fcdahale eden aktif bir operat\u00f6re d\u00f6n\u00fc\u015fmektedir. Ki bu yakla\u015f\u0131m\u0131n en b\u00fcy\u00fck etkisi geli\u015ftirme s\u00fcre\u00e7lerinde g\u00f6r\u00fclmektedir. Normalde saatler s\u00fcrebilecek kurulum, entegrasyon ve test s\u00fcre\u00e7leri ciddi \u00f6l\u00e7\u00fcde sadele\u015fmektedir. Agent taraf\u0131ndan t\u00fcm sistem kontrol edilebilece\u011fi i\u00e7in geli\u015ftirme d\u00f6ng\u00fcs\u00fc h\u0131zlanmakta ve insan m\u00fcdahalesi minimuma inmektedir.<\/p>\n<p>\u00d6zetle Aspire;<\/p>\n<ul style=\"font-size:14px;\">\n<li>Agent&#8217;lara sistem kurma ve y\u00f6netme yetene\u011fi kazand\u0131rmaktad\u0131r<\/li>\n<li>T\u00fcm bile\u015fenleri merkezi ve orkestre bir yap\u0131da sunmaktad\u0131r<\/li>\n<li>AI agent&#8217;lar\u0131n\u0131n sistemle do\u011frudan etkile\u015fim kurmas\u0131n\u0131 sa\u011flamaktad\u0131r<\/li>\n<li>Geli\u015ftirme s\u00fcre\u00e7lerini h\u0131zland\u0131rmakta ve sadele\u015ftirmektedir<\/li>\n<\/ul>\n<p>\u00d6rnek vermemiz gerekirse bir yapay zek\u00e2 agent&#8217;\u0131 a\u015fa\u011f\u0131daki gibi birka\u00e7 sat\u0131r kodla eksiksiz bir distributed uygulamay\u0131 rahatl\u0131kla aya\u011fa kald\u0131rabilmektedir:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = DistributedApplication.CreateBuilder(args);\r\n\r\nvar redisCache = builder.AddRedis(&quot;redisCache&quot;);\r\nvar postgreDB = builder.AddPostgres(&quot;postgreDB&quot;)\r\n                       .WithImage(&quot;postgres&quot;, &quot;18&quot;)\r\n                       .AddDatabase(&quot;mydb&quot;);\r\n\r\nvar rabbitMQMessaging = builder.AddRabbitMQ(&quot;rabbitMQMessaging&quot;)\r\n                               .WithImage(&quot;rabbitmq&quot;, &quot;latest&quot;);\r\n\r\nvar myAPI = builder.AddProject&lt;Projects.MyAPI&gt;(&quot;myAPI&quot;)\r\n                   .WithReference(redisCache)\r\n                   .WithReference(postgreDB)\r\n                   .WithReference(rabbitMQMessaging)\r\n                   .WithExternalHttpEndpoints();\r\n\r\nvar aiService = builder.AddPythonApp(&quot;aiService&quot;, &quot;..\/ai-service&quot;, &quot;main.py&quot;)\r\n                       .WithReference(postgreDB)\r\n                       .WithReference(rabbitMQMessaging)\r\n                       .WithExternalHttpEndpoints();\r\n\r\nvar myFrontend = builder.AddJavaScriptApp(&quot;myFrontend&quot;, &quot;..\/MyFrontend&quot;)\r\n                   .WithRunScript(&quot;start&quot;)\r\n                   .WithReference(myAPI)\r\n                   .WithReference(aiService.GetEndpoint(&quot;http&quot;))\r\n                   .WithExternalHttpEndpoints();\r\n\r\nbuilder.Build().Run();\r\n<\/pre>\n<\/div>\n<p>Bu \u00e7al\u0131\u015fmaya g\u00f6z atarsak e\u011fer tek kalemde a\u015fa\u011f\u0131daki i\u015flemleri ba\u015flatt\u0131\u011f\u0131n\u0131 s\u00f6yleyebiliriz;<\/p>\n<ul style=\"font-size:14px;\">\n<li>Redis cache aya\u011fa kald\u0131r\u0131lmakta,<\/li>\n<li>PostgreSQL aya\u011fa kald\u0131r\u0131lmakta, veritaban\u0131 olu\u015fturulmakta,<\/li>\n<li>RabbitMQ message broker aya\u011fa kald\u0131r\u0131lmakta,<\/li>\n<li>Asp.NET Core API aya\u011fa kald\u0131r\u0131lmakta,<\/li>\n<li>Python yapay zeka servisi aya\u011fa kald\u0131r\u0131lmakta,<\/li>\n<li>JavaScript frontend uygulamas\u0131 aya\u011fa kald\u0131r\u0131lmakta<\/li>\n<li>ve t\u00fcm bu s\u00fcre\u00e7te mevcut bile\u015fenler aras\u0131ndaki t\u00fcm a\u011f ba\u011flant\u0131lar\u0131 otomatik olarak yap\u0131land\u0131r\u0131lmaktad\u0131r.<\/li>\n<\/ul>\n<p>Evet&#8230; Bir AI agent bu yap\u0131land\u0131rmay\u0131 rahatl\u0131kla de\u011fi\u015ftirebilir, \u00e7al\u0131\u015ft\u0131rabilir, t\u00fcm sistemi tek elden test edebilir ve yineleyebilir. Ve bunlar\u0131n hepsini otonom olarak ger\u00e7ekle\u015ftirebilir&#8230;<\/p>\n<h4>\u00d6l\u00e7eklendirme S\u00fcre\u00e7lerinde Gelen \u0130zolasyon Modu Nedir?<\/h4>\n<div style=\"background-color: #f4f4f4; padding: 15px; border-left: 5px solid #3498db; margin: 20px 0; font-style: italic; color: #333; font-size: 14px; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1); border-radius: 8px; width: 40%; float: right; box-sizing: border-box;\">\n  <strong><em>Branch \u0130le Worktree Fark\u0131 Nedir?<\/em><\/strong><br \/>\nBranch, mant\u0131ksald\u0131r. Sadece bir pointer (i\u015faret\u00e7i) olarak kullan\u0131lmakta ve bir commit&#8217;i g\u00f6stermektedir. Yani dosya falan yoktur, sadece referans i\u015flemi g\u00f6r\u00fcr.<\/p>\n<p>Worktree ise ger\u00e7ek klas\u00f6rd\u00fcr. \u0130\u00e7inde dosyalar olan, kodun fiziksel halidir.<\/p>\n<blockquote style=\"font-size:12px;\"><p><em>Branch, bir kitapta ayra\u00e7 koyulan sayfad\u0131r. Worktree ise kitab\u0131n fiziksel kopyas\u0131d\u0131r.<\/em><\/p><\/blockquote>\n<\/div>\n<p>\u015eimdi varsayal\u0131m ki, bu Aspire projesini birden fazla worktree \u00fczerinden aya\u011fa kald\u0131rarak \u00f6l\u00e7eklendirmeye \u00e7al\u0131\u015f\u0131yoruz. Tabi bunun i\u00e7in a\u015fa\u011f\u0131daki gibi \u00f6ncelikle iki branch olu\u015fturuyor, ard\u0131ndan bu branch&#8217;ler \u00fczerinden de worktree&#8217;leri olu\u015fturuyoruz&#8230;<\/p>\n<div style=\"background:#0d0d0d;color:#e6e6e6;font-family:Consolas,'Courier New',monospace;font-size:14px;white-space:pre;line-height:0.8;padding:12px;\">\u06dd git branch feature1<br \/>\n\u06dd git branch feature2<br \/>\n\u06dd git worktree add ..\/proj-feature1 feature1<br \/>\n\u06dd git worktree add ..\/proj-feature2 feature2\n<\/div>\n<p>&nbsp;<br \/>\nBu vaziyette beklenen \u015fudur ki, her iki worktree \u00fczerinden <code>dotnet run<\/code> komutu \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131 taktirde port \u00e7ak\u0131\u015fmalar\u0131yla kar\u015f\u0131la\u015f\u0131ls\u0131n. \u00d6yle de\u011fil mi?<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/05\/Aspire-13.2-Ile-AI-Agentlari-Olceklendirme-Parallel-Development-Icin-Gelen-Izolasyon-Katmani.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/05\/Aspire-13.2-Ile-AI-Agentlari-Olceklendirme-Parallel-Development-Icin-Gelen-Izolasyon-Katmani.png\" alt=\"Aspire 13.2 \u0130le AI Agent&#039;lar\u0131 \u00d6l\u00e7eklendirme: Parallel Development \u0130\u00e7in Gelen \u0130zolasyon Katman\u0131\" width=\"1666\" height=\"835\" class=\"aligncenter size-full wp-image-28668\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/05\/Aspire-13.2-Ile-AI-Agentlari-Olceklendirme-Parallel-Development-Icin-Gelen-Izolasyon-Katmani.png 1666w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/05\/Aspire-13.2-Ile-AI-Agentlari-Olceklendirme-Parallel-Development-Icin-Gelen-Izolasyon-Katmani-300x150.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/05\/Aspire-13.2-Ile-AI-Agentlari-Olceklendirme-Parallel-Development-Icin-Gelen-Izolasyon-Katmani-1024x513.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/05\/Aspire-13.2-Ile-AI-Agentlari-Olceklendirme-Parallel-Development-Icin-Gelen-Izolasyon-Katmani-768x385.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/05\/Aspire-13.2-Ile-AI-Agentlari-Olceklendirme-Parallel-Development-Icin-Gelen-Izolasyon-Katmani-1536x770.png 1536w\" sizes=\"auto, (max-width: 1666px) 100vw, 1666px\" \/><\/a>Ama g\u00f6rselden g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere herhangi bir port \u00e7ak\u0131\u015fmas\u0131 s\u00f6z konusu de\u011fildir! Bunun nedeni, Aspire 13.2 ile dashboard portunun art\u0131k process bazl\u0131 bir socket\/<a href=\"https:\/\/www.gencayyildiz.com\/blog\/tag\/mutex\/\" target=\"_blank\">mutex<\/a> mekanizmas\u0131yla y\u00f6netilmesidir. Bu mekanizma sayesinde ikinci instance ayn\u0131 porta ba\u011flanmaya \u00e7al\u0131\u015ft\u0131\u011f\u0131 taktirde, her instance&#8217;\u0131n kendi kaynaklar\u0131n\u0131 (Redis, PosgresSQL vs.) ayr\u0131 ayr\u0131 register etmesi kayd\u0131yla, \u00e7ak\u0131\u015fma yerine ayn\u0131 dashboard process&#8217;ini payla\u015fmaktad\u0131r. Haliyle bu \u015fekilde birden fazla instance&#8217;\u0131 aya\u011fa kald\u0131rsak dahi hepsi ayn\u0131 kaynaklar\u0131 kullanacakt\u0131r. Bu da dashboard&#8217;a girildi\u011finde t\u00fcm kaynaklar\u0131n tek ekranda g\u00f6r\u00fclmesini sa\u011flayacakt\u0131r.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/05\/Aspire-13.2-Ile-AI-Agentlari-Olceklendirme-Parallel-Development-Icin-Gelen-Izolasyon-Katmani-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/05\/Aspire-13.2-Ile-AI-Agentlari-Olceklendirme-Parallel-Development-Icin-Gelen-Izolasyon-Katmani-1.png\" alt=\"Aspire 13.2 \u0130le AI Agent&#039;lar\u0131 \u00d6l\u00e7eklendirme: Parallel Development \u0130\u00e7in Gelen \u0130zolasyon Katman\u0131\" width=\"1721\" height=\"539\" class=\"aligncenter size-full wp-image-28669\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/05\/Aspire-13.2-Ile-AI-Agentlari-Olceklendirme-Parallel-Development-Icin-Gelen-Izolasyon-Katmani-1.png 1721w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/05\/Aspire-13.2-Ile-AI-Agentlari-Olceklendirme-Parallel-Development-Icin-Gelen-Izolasyon-Katmani-1-300x94.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/05\/Aspire-13.2-Ile-AI-Agentlari-Olceklendirme-Parallel-Development-Icin-Gelen-Izolasyon-Katmani-1-1024x321.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/05\/Aspire-13.2-Ile-AI-Agentlari-Olceklendirme-Parallel-Development-Icin-Gelen-Izolasyon-Katmani-1-768x241.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/05\/Aspire-13.2-Ile-AI-Agentlari-Olceklendirme-Parallel-Development-Icin-Gelen-Izolasyon-Katmani-1-1536x481.png 1536w\" sizes=\"auto, (max-width: 1721px) 100vw, 1721px\" \/><\/a>Tabi burada bizler i\u00e7in \u00f6nem arz eden bir durum s\u00f6z konusudur. O da servislerin \u00f6l\u00e7eklendirilmesi, yani izolasyonudur. Gelin bunu inceleyerek devam edelim&#8230;<\/p>\n<h5>Servis \u0130zolasyonu Problemi<\/h5>\n<p>\u015eu anki mevcut yap\u0131da Aspire, her servise random port atamaktad\u0131r. Ancak her worktree instance&#8217;\u0131 ayn\u0131 port&#8217;taki kaynaklar\u0131 kulland\u0131\u011f\u0131 i\u00e7in ortak Redis&#8217;i, PostgreSQL&#8217;i ve RabbitMQ&#8217;yu kullanmaktad\u0131r. Halbuki olmas\u0131 gereken bunlar\u0131n birbirlerinden worktree seviyesinde izole edilmesidir. Aksi taktirde bir kayna\u011fa <em>feature1<\/em>&#8216;de yap\u0131lan m\u00fcdahale <em>feature2<\/em>&#8216;yi de an\u0131nda etkileyecektir.<\/p>\n<blockquote style=\"font-size:12px;\"><p><em><u>feature1<\/u> worktree \u2192 &#8220;redisCache&#8221; container&#8217;\u0131 ba\u015flat\u0131yor<br \/>\n<u>feature2<\/u> worktree \u2192 ayn\u0131 isimde container zaten var oldu\u011fu i\u00e7in onu reuse ediyor<\/em><\/p><\/blockquote>\n<p>Bu problemi \u00e7\u00f6zmek ve kaynaklar aras\u0131nda worktree bazl\u0131 izolasyonu sa\u011flamak i\u00e7in a\u015fa\u011f\u0131daki gibi k\u00fc\u00e7\u00fck bir yard\u0131mc\u0131 s\u0131n\u0131f geli\u015ftirmemiz i\u015fimizi g\u00f6recektir:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public static class GitFolderResolver\r\n    {\r\n        public static string GetGitFolderName(string? workingDirectory = null)\r\n        {\r\n            try\r\n            {\r\n                var directory = workingDirectory ?? Directory.GetCurrentDirectory();\r\n                var gitPath = FindGitPath(directory);\r\n\r\n                if (gitPath is null)\r\n                    return &quot;default&quot;;\r\n\r\n                if (Directory.Exists(gitPath))\r\n                {\r\n                    var repoDirectory = Path.GetDirectoryName(gitPath);\r\n                    return Path.GetFileName(repoDirectory).Replace(&quot;.&quot;, &quot;&quot;) ?? &quot;default&quot;;\r\n                }\r\n\r\n                if (File.Exists(gitPath))\r\n                {\r\n                    var gitFileContent = File.ReadAllText(gitPath);\r\n\r\n                    if (gitFileContent.StartsWith(&quot;gitdir:&quot;))\r\n                    {\r\n                        var gitDirPath = gitFileContent.Substring(&quot;gitdir:&quot;.Length).Trim();\r\n                        var worktreeSegments = gitDirPath.Split(new&#x5B;] { '\/', '\\\\' }, StringSplitOptions.RemoveEmptyEntries);\r\n\r\n                        for (int i = 0; i &lt; worktreeSegments.Length - 1; i++)\r\n                            if (worktreeSegments&#x5B;i] == &quot;worktrees&quot;)\r\n                                return worktreeSegments&#x5B;i + 1];\r\n\r\n                        return Path.GetFileName(directory).Replace(&quot;.&quot;, &quot;&quot;) ?? &quot;default&quot;;\r\n                    }\r\n                }\r\n\r\n                return &quot;default&quot;;\r\n            }\r\n            catch\r\n            {\r\n                return &quot;default&quot;;\r\n            }\r\n\r\n            static string? FindGitPath(string directory)\r\n            {\r\n                var currentDirectory = directory;\r\n\r\n                while (!string.IsNullOrEmpty(currentDirectory))\r\n                {\r\n                    var gitPath = Path.Combine(currentDirectory, &quot;.git&quot;);\r\n\r\n                    if (Directory.Exists(gitPath) || File.Exists(gitPath))\r\n                        return gitPath;\r\n\r\n                    var parentDirectory = Path.GetDirectoryName(currentDirectory);\r\n                    if (parentDirectory == currentDirectory)\r\n                        break;\r\n\r\n                    currentDirectory = parentDirectory;\r\n                }\r\n\r\n                return null;\r\n            }\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki kodda yap\u0131lan i\u015flemleri anlayabilmek i\u00e7in \u015funun bilinmesi gerekmektedir: normal bir Git repo&#8217;da <code>.git<\/code> bir klas\u00f6rken, worktree&#8217;de ise <code>.git<\/code> bir dosyad\u0131r. Haliyle hangi worktree&#8217;de oldu\u011fumuzu bu dosyay\u0131 okuyarak \u00e7\u0131kart\u0131yoruz.<\/p>\n<p>Ve ard\u0131ndan <em>AppHost<\/em>&#8216;da a\u015fa\u011f\u0131daki gibi bu s\u0131n\u0131f\u0131 kullanarak worktree bazl\u0131 container isimlerini ayarlayal\u0131m:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\nvar worktreeName = GitFolderResolver.GetGitFolderName();\r\n\r\nvar redisCache = builder.AddRedis($&quot;redisCache-{worktreeName}&quot;);\r\nvar postgreDB = builder.AddPostgres($&quot;postgreDB-{worktreeName}&quot;)\r\n                       .WithImage(&quot;postgres&quot;, &quot;18&quot;)\r\n                       .AddDatabase(&quot;mydb&quot;);\r\n\r\nvar rabbitMQMessaging = builder.AddRabbitMQ($&quot;rabbitMQMessaging-{worktreeName}&quot;)\r\n                               .WithImage(&quot;rabbitmq&quot;, &quot;latest&quot;);\r\n.\r\n.\r\n.\r\n<\/pre>\n<\/div>\n<p>Bu i\u015flem neticesinde Aspire&#8217;\u0131 \u00f6l\u00e7eklendirdi\u011fimizde a\u015fa\u011f\u0131daki g\u00f6rselde oldu\u011fu gibi her bir worktree&#8217;ye kar\u015f\u0131l\u0131k bir container kayna\u011f\u0131n\u0131n \u00fcretildi\u011fini g\u00f6receksiniz:<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/05\/Aspire-13.2-Ile-AI-Agentlari-Olceklendirme-Parallel-Development-Icin-Gelen-Izolasyon-Katmani-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/05\/Aspire-13.2-Ile-AI-Agentlari-Olceklendirme-Parallel-Development-Icin-Gelen-Izolasyon-Katmani-2.png\" alt=\"Aspire 13.2 \u0130le AI Agent&#039;lar\u0131 \u00d6l\u00e7eklendirme: Parallel Development \u0130\u00e7in Gelen \u0130zolasyon Katman\u0131\" width=\"334\" height=\"229\" class=\"aligncenter size-full wp-image-28670\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/05\/Aspire-13.2-Ile-AI-Agentlari-Olceklendirme-Parallel-Development-Icin-Gelen-Izolasyon-Katmani-2.png 334w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/05\/Aspire-13.2-Ile-AI-Agentlari-Olceklendirme-Parallel-Development-Icin-Gelen-Izolasyon-Katmani-2-300x206.png 300w\" sizes=\"auto, (max-width: 334px) 100vw, 334px\" \/><\/a>B\u00f6ylece servisler aras\u0131 izolasyon ba\u015far\u0131yla sa\u011flanm\u0131\u015f olacakt\u0131r\ud83d\udc4f<\/p>\n<p>Nihai olarak;<\/p>\n<p>Aspire, \u00f6l\u00e7eklendirme s\u00fcre\u00e7lerine dair gelmi\u015f olan bu izolasyon katman\u0131 ile AI agent \u00e7al\u0131\u015fmalar\u0131n\u0131 s\u0131ral\u0131 \u00e7al\u0131\u015fan bir yap\u0131dan ger\u00e7ek anlamda paralel bir yap\u0131ya d\u00f6n\u00fc\u015ft\u00fcrm\u00fc\u015f bulunmaktad\u0131r. Port \u00e7ak\u0131\u015fmalar\u0131 sorununu k\u00f6kten \u00e7\u00f6zen bu yenilik, Git worktree&#8217;leri \u00fczerinde \u00e7al\u0131\u015fan birden fazla yapay zeka agent&#8217;\u0131n\u0131n ayn\u0131 anda tamamen ba\u011f\u0131ms\u0131z ve birbirini engellemeden distributed sistemleri aya\u011fa kald\u0131rmas\u0131n\u0131, u\u00e7tan uca test etmesini ve sistem genelindeki kaynak durumlar\u0131n\u0131, loglar\u0131 ve izleme verilerini programatik olarak sorgulayarak otonom bir \u015fekilde hata ay\u0131klamas\u0131n\u0131 m\u00fcmk\u00fcn k\u0131lmaktad\u0131r. B\u00f6ylece tek bir <em>Program.cs<\/em> dosyas\u0131yla Redis, PostgreSQL, RabbitMQ, API, Python AI Service ve JavaScript Frontend&#8217;i i\u00e7eren karma\u015f\u0131k uygulama y\u0131\u011f\u0131nlar\u0131n\u0131 saniyeler i\u00e7erisinde orkastre edebilen Aspire, art\u0131k yaln\u0131zca tek bir agent i\u00e7in de\u011fil; ayn\u0131 anda d\u00f6rt, be\u015f hatta daha fazla agent i\u00e7in de sorunsuz bir geli\u015ftirme altyap\u0131s\u0131 sunmakta, yapay zeka destekli yaz\u0131l\u0131m \u00fcretimini ger\u00e7ek anlamda end\u00fcstriyel \u00f6l\u00e7ekte paralel i\u015f ak\u0131\u015flar\u0131na ta\u015f\u0131m\u0131\u015f bulunmaktad\u0131r.<\/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<div style=\"max-width:720px;margin:24px auto;padding:18px 20px;border-radius:12px;background:linear-gradient(135deg,#0d1117,#161b22);border:1px solid #30363d;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Arial,sans-serif;color:#e6edf3;box-shadow:0 10px 30px rgba(0,0,0,.35);\">\n<div style=\"display:flex;align-items:center;gap:14px;margin-bottom:12px;\">\n    <svg style=\"width:34px;height:34px;fill:#58a6ff;flex-shrink:0;\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n      <path d=\"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82a7.65 7.65 0 012-.27c.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z\"><\/path>\n    <\/svg><\/p>\n<div>\n<div style=\"font-size:18px;font-weight:600;line-height:1.2;\">\u00d6rnek \u00e7al\u0131\u015fmaya a\u015fa\u011f\u0131daki GitHub reposundan eri\u015febilirsiniz.<\/div>\n<div style=\"font-size:13px;color:#8b949e;\">https:\/\/github.com\/gncyyldz\/Scaling.AI.Agents.With.Aspire.AppHost<\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div style=\"font-size:14px;line-height:1.6;color:#c9d1d9;margin-bottom:14px;\">\n    Bu repository, ilgili konuya dair \u00f6rnek \u00e7al\u0131\u015fman\u0131n kaynak kodlar\u0131n\u0131 ve mimari yap\u0131s\u0131n\u0131 i\u00e7ermektedir. Detaylar i\u00e7in GitHub \u00fczerinden incelemede bulunabilirsiniz.\n  <\/div>\n<p>  <a href=\"https:\/\/github.com\/gncyyldz\/Scaling.AI.Agents.With.Aspire.AppHost\" target=\"_blank\" rel=\"noopener noreferrer\"\n     style=\"display:inline-block;padding:10px 16px;border-radius:8px;background:#238636;color:#ffffff;text-decoration:none;font-size:14px;font-weight:600;transition:all .2s ease;\"><br \/>\n    GitHub\u2019da G\u00f6r\u00fcnt\u00fcle \u2192<br \/>\n  <\/a><\/p>\n<\/div>\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, Aspire, yapay zek\u00e2 destekli geli\u015ftirme d\u00fcnyas\u0131nda ger\u00e7ekten oyunun kurallar\u0131n\u0131 de\u011fi\u015ftiren bir yakla\u015f\u0131m sunmaktad\u0131r. D\u00fc\u015f\u00fcnsenize, tek bir Program.cs dosyas\u0131yla, i\u00e7erisinde backend API&#8217;leri, python servisleri, frontend uygulamalar\u0131, veritabanlar\u0131 yahut message queue&#8217;lar\u0131 olan, tamamen orkestre edilmi\u015f&#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":27395,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5183],"tags":[5306,5716,5717,5718],"class_list":["post-28662","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aspire","tag-ai-agent","tag-aspire-13-2","tag-aspire-ai-agent","tag-parallel-development"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28662","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=28662"}],"version-history":[{"count":8,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28662\/revisions"}],"predecessor-version":[{"id":28674,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28662\/revisions\/28674"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/27395"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=28662"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=28662"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=28662"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}