{"id":36849,"date":"2025-12-24T00:30:44","date_gmt":"2025-12-23T21:30:44","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/"},"modified":"2025-12-24T00:30:44","modified_gmt":"2025-12-23T21:30:44","slug":"c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/","title":{"rendered":"C# Mimarisinde Ustal\u0131k: .NET&#8217;te Olay Tabanl\u0131 Mimari (Mesajla\u015fma ile Temiz S\u0131n\u0131rlar) &#8211; B\u00f6l\u00fcm 12"},"content":{"rendered":"<h2>C# Mimarisinde Ustal\u0131k: .NET&#8217;te Olay Tabanl\u0131 Mimari (Mesajla\u015fma ile Temiz S\u0131n\u0131rlar) &#8211; B\u00f6l\u00fcm 12<\/h2>\n<p>Modern yaz\u0131l\u0131m sistemleri, giderek artan karma\u015f\u0131kl\u0131k, \u00f6l\u00e7eklenebilirlik ve esneklik gereksinimleriyle kar\u015f\u0131 kar\u015f\u0131yad\u0131r. Bu ba\u011flamda, geleneksel monolitik mimariler yerini daha mod\u00fcler, da\u011f\u0131t\u0131k ve reaktif yap\u0131lara b\u0131rakmaktad\u0131r. Olay Tabanl\u0131 Mimari (Event-Driven Architecture &#8211; EDA), .NET ekosisteminde de pop\u00fclaritesi artan, sistemler aras\u0131 ileti\u015fimi olaylar arac\u0131l\u0131\u011f\u0131yla sa\u011flayan g\u00fc\u00e7l\u00fc bir yakla\u015f\u0131md\u0131r. Bu makalenin on ikinci b\u00f6l\u00fcm\u00fcnde, EDA&#8217;n\u0131n temel prensiplerini, mesajla\u015fma mekanizmalar\u0131yla temiz s\u0131n\u0131rlar olu\u015fturman\u0131n \u00f6nemini ve C#\/.NET ortam\u0131nda bu mimariyi nas\u0131l uygulayabilece\u011fimizi derinlemesine inceleyece\u011fiz. Amac\u0131m\u0131z, gev\u015fek ba\u011fl\u0131, \u00f6l\u00e7eklenebilir ve s\u00fcrd\u00fcr\u00fclebilir uygulamalar geli\u015ftirmek i\u00e7in olay tabanl\u0131 mimarinin g\u00fcc\u00fcnden nas\u0131l yararlanabilece\u011fimizi g\u00f6stermektir.<\/p>\n<h2>Olay Tabanl\u0131 Mimariye Giri\u015f ve Temel Kavramlar<\/h2>\n<p>Olay Tabanl\u0131 Mimari (EDA), sistem bile\u015fenlerinin birbirleriyle do\u011frudan \u00e7a\u011fr\u0131lar yerine olaylar arac\u0131l\u0131\u011f\u0131yla ileti\u015fim kurdu\u011fu bir yaz\u0131l\u0131m tasar\u0131m paradigmalar\u0131 b\u00fct\u00fcn\u00fcd\u00fcr. Bir bile\u015fen bir olay meydana geldi\u011finde bunu yay\u0131mlar ve di\u011fer bile\u015fenler bu olaylara abone olarak tepki verir. Bu yakla\u015f\u0131m, \u00f6zellikle da\u011f\u0131t\u0131k sistemlerde ve mikroservis mimarilerinde b\u00fcy\u00fck avantajlar sunar.<\/p>\n<h3>Olay Tabanl\u0131 Mimari Nedir?<\/h3>\n<p>EDA&#8217;da, bir sistemdeki her t\u00fcrl\u00fc de\u011fi\u015fiklik veya \u00f6nemli durum ge\u00e7i\u015fi bir &#8220;olay&#8221; olarak kabul edilir. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n kaydolmas\u0131, bir sipari\u015fin olu\u015fturulmas\u0131 veya bir \u00fcr\u00fcn\u00fcn stok durumunun de\u011fi\u015fmesi birer olayd\u0131r. Bu olaylar, olay\u0131 \u00fcreten &#8220;olay \u00fcreticisi&#8221; (event producer) taraf\u0131ndan yay\u0131mlan\u0131r ve bu olaylarla ilgilenen &#8220;olay t\u00fcketicileri&#8221; (event consumers) taraf\u0131ndan dinlenir ve i\u015flenir. Bu model, bile\u015fenler aras\u0131nda do\u011frudan ba\u011f\u0131ml\u0131l\u0131klar\u0131 ortadan kald\u0131rarak daha esnek ve adapte edilebilir sistemler olu\u015fturulmas\u0131na olanak tan\u0131r.<\/p>\n<h3>Geleneksel Mimarilere G\u00f6re Avantajlar\u0131<\/h3>\n<p>Geleneksel katmanl\u0131 veya monolitik mimarilerde, bile\u015fenler genellikle birbirlerini do\u011frudan \u00e7a\u011f\u0131r\u0131r ve bu da y\u00fcksek ba\u011f\u0131ml\u0131l\u0131\u011fa yol a\u00e7ar. EDA ise bu ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 gev\u015fetir. Temel avantajlar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li><b>Gev\u015fek Ba\u011fl\u0131l\u0131k (Loose Coupling):<\/b> \u00dcreticiler t\u00fcketicileri bilmez, sadece olaylar\u0131 yay\u0131mlar. T\u00fcketiciler de \u00fcreticileri bilmez, sadece olaylara abone olur. Bu, her bile\u015fenin ba\u011f\u0131ms\u0131z olarak geli\u015ftirilmesine, da\u011f\u0131t\u0131lmas\u0131na ve \u00f6l\u00e7eklenmesine olanak tan\u0131r.<\/li>\n<li><b>\u00d6l\u00e7eklenebilirlik:<\/b> Olay t\u00fcketicileri paralel olarak \u00e7al\u0131\u015fabilir, bu da i\u015f y\u00fck\u00fcn\u00fcn kolayca da\u011f\u0131t\u0131lmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><b>Esneklik ve Geni\u015fletilebilirlik:<\/b> Yeni bir \u00f6zellik eklemek genellikle yeni bir olay t\u00fcketicisi yazmak kadar basittir, mevcut kodu de\u011fi\u015ftirmeye gerek kalmaz.<\/li>\n<li><b>Hata Tolerans\u0131:<\/b> Bir bile\u015fen ar\u0131zalansa bile, di\u011fer bile\u015fenler olaylar\u0131 i\u015flemeye devam edebilir veya olay kuyruklar\u0131nda bekleyebilir.<\/li>\n<\/ul>\n<h3>Temel Bile\u015fenler: Olaylar, \u00dcreticiler, T\u00fcketiciler<\/h3>\n<p>EDA&#8217;n\u0131n \u00fc\u00e7 ana bile\u015feni vard\u0131r:<\/p>\n<ul>\n<li><b>Olay (Event):<\/b> Sistemde meydana gelen \u00f6nemli bir durumu veya de\u011fi\u015fikli\u011fi temsil eden, ge\u00e7mi\u015fe d\u00f6n\u00fck bir ger\u00e7ektir. Genellikle sadece veri i\u00e7erir ve bir komut gibi bir eylem bekletmez. \u00d6rnek: <code>Sipari\u015fOlu\u015fturuldu<\/code>, <code>Kullan\u0131c\u0131Kaydoldu<\/code>.<\/li>\n<li><b>Olay \u00dcreticisi (Event Producer \/ Publisher):<\/b> Bir olay\u0131n meydana geldi\u011fini alg\u0131layan ve bu olay\u0131 yay\u0131mlayan bile\u015fendir. Bir olay\u0131 yay\u0131mlad\u0131\u011f\u0131nda, bu olay\u0131 kimin t\u00fcketece\u011fini veya nas\u0131l i\u015flenece\u011fini bilmez.<\/li>\n<li><b>Olay T\u00fcketicisi (Event Consumer \/ Subscriber):<\/b> Belirli olay t\u00fcrlerine abone olan ve bu olaylar yay\u0131mland\u0131\u011f\u0131nda belirli i\u015f mant\u0131\u011f\u0131n\u0131 y\u00fcr\u00fcten bile\u015fendir.<\/li>\n<\/ul>\n<h2>Temiz S\u0131n\u0131rlar ve Mesajla\u015fman\u0131n \u00d6nemi<\/h2>\n<p>Olay tabanl\u0131 mimaride &#8220;temiz s\u0131n\u0131rlar&#8221; kavram\u0131, sistemin farkl\u0131 mod\u00fcllerinin veya mikroservislerinin birbirlerinden ba\u011f\u0131ms\u0131z, kendi sorumluluk alanlar\u0131 i\u00e7erisinde kalmas\u0131n\u0131 ifade eder. Mesajla\u015fma, bu s\u0131n\u0131rlar\u0131 koruman\u0131n ve sistemler aras\u0131 ileti\u015fimi sa\u011fl\u0131kl\u0131 bir \u015fekilde sa\u011flaman\u0131n anahtar\u0131d\u0131r.<\/p>\n<h3>Gev\u015fek Ba\u011fl\u0131l\u0131k (Loose Coupling)<\/h3>\n<p>Gev\u015fek ba\u011fl\u0131l\u0131k, bir bile\u015fenin di\u011fer bile\u015fenler hakk\u0131nda m\u00fcmk\u00fcn oldu\u011funca az bilgiye sahip olmas\u0131 anlam\u0131na gelir. EDA&#8217;da bu, olay \u00fcreticisinin t\u00fcketicileri, t\u00fcketicilerin de \u00fcreticileri bilmemesiyle sa\u011flan\u0131r. \u00dcretici sadece bir olay\u0131 yay\u0131mlar; bu olay\u0131 kimin, ne zaman veya nas\u0131l i\u015fleyece\u011fini umursamaz. Bu sayede, bir bile\u015fende yap\u0131lan de\u011fi\u015fiklikler di\u011fer bile\u015fenleri do\u011frudan etkilemez, sistemin genel esnekli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131r\u0131r.<\/p>\n<h3>S\u0131n\u0131rlar\u0131n Tan\u0131mlanmas\u0131: Bounded Contexts<\/h3>\n<p>Domain-Driven Design (DDD) prensiplerinden biri olan &#8220;Bounded Context&#8221; (S\u0131n\u0131rl\u0131 Ba\u011flam), karma\u015f\u0131k bir i\u015f alan\u0131n\u0131 daha k\u00fc\u00e7\u00fck, y\u00f6netilebilir ve tutarl\u0131 ba\u011flamlara ay\u0131rmay\u0131 ifade eder. Her ba\u011flam\u0131n kendi i\u00e7inde tutarl\u0131 bir dili, modeli ve sorumluluklar\u0131 vard\u0131r. Olay tabanl\u0131 mimaride, her Bounded Context genellikle kendi olaylar\u0131n\u0131 yay\u0131mlar ve di\u011fer ba\u011flamlar\u0131n olaylar\u0131n\u0131 t\u00fcketir. Bu, her ba\u011flam\u0131n kendi i\u00e7 i\u015fleyi\u015fini d\u0131\u015f d\u00fcnyadan soyutlamas\u0131na ve b\u00f6ylece temiz s\u0131n\u0131rlar olu\u015fturmas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<p>\u00d6rne\u011fin, bir e-ticaret uygulamas\u0131nda &#8220;Sipari\u015f Y\u00f6netimi&#8221; ve &#8220;Stok Y\u00f6netimi&#8221; ayr\u0131 Bounded Context&#8217;ler olabilir. Sipari\u015f Y\u00f6netimi bir sipari\u015f olu\u015fturdu\u011funda <code>Sipari\u015fOlu\u015fturuldu<\/code> olay\u0131n\u0131 yay\u0131mlar. Stok Y\u00f6netimi bu olay\u0131 dinler ve ilgili \u00fcr\u00fcn\u00fcn sto\u011funu g\u00fcnceller. Bu sayede iki ba\u011flam birbirine s\u0131k\u0131ca ba\u011flanmaz.<\/p>\n<h3>Mesajla\u015fman\u0131n Rol\u00fc: Senkronizasyon ve \u0130leti\u015fim<\/h3>\n<p>Mesajla\u015fma, olay tabanl\u0131 mimarinin kalbinde yer al\u0131r. Olaylar\u0131n g\u00fcvenilir bir \u015fekilde \u00fcreticiden t\u00fcketiciye iletilmesini sa\u011flar. Mesajla\u015fma sistemleri (mesaj kuyruklar\u0131 veya olay veriyollar\u0131), olaylar\u0131 tamponlar, da\u011f\u0131t\u0131r ve genellikle &#8220;at least once&#8221; (en az bir kez) veya &#8220;exactly once&#8221; (tam olarak bir kez) teslim garantisi sunar. Bu, sistemler aras\u0131 ileti\u015fimin asenkron ve g\u00fcvenilir olmas\u0131n\u0131 sa\u011flar. Ayr\u0131ca, mesajla\u015fma sayesinde farkl\u0131 teknolojilerle yaz\u0131lm\u0131\u015f sistemler bile olaylar arac\u0131l\u0131\u011f\u0131yla ileti\u015fim kurabilir, bu da entegrasyonu kolayla\u015ft\u0131r\u0131r.<\/p>\n<h2>Domain Olaylar\u0131 ve Entegrasyon Olaylar\u0131<\/h2>\n<p>Olay tabanl\u0131 mimaride iki ana olay t\u00fcr\u00fc bulunur: Domain Olaylar\u0131 ve Entegrasyon Olaylar\u0131. Bu iki t\u00fcr aras\u0131ndaki fark\u0131 anlamak, mimarinizi do\u011fru bir \u015fekilde tasarlaman\u0131z i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h3>Domain Olaylar\u0131 (Domain Events) Nedir?<\/h3>\n<p>Domain Olaylar\u0131, belirli bir Bounded Context (S\u0131n\u0131rl\u0131 Ba\u011flam) i\u00e7inde meydana gelen ve o ba\u011flam\u0131n i\u015f mant\u0131\u011f\u0131 i\u00e7in \u00f6nemli olan olaylard\u0131r. Genellikle ayn\u0131 mikroservis veya mod\u00fcl i\u00e7indeki farkl\u0131 bile\u015fenler aras\u0131nda ileti\u015fim kurmak i\u00e7in kullan\u0131l\u0131rlar. Bir domain olay\u0131, bir i\u015f i\u015fleminin sonucunu temsil eder ve genellikle bir i\u015flem (transaction) kapsam\u0131nda yay\u0131mlan\u0131r. \u00d6rne\u011fin, bir <code>Sipari\u015fOlu\u015fturuldu<\/code> olay\u0131, <code>Sipari\u015f<\/code> domain&#8217;i i\u00e7inde meydana gelir ve ayn\u0131 servis i\u00e7indeki <code>Stok<\/code> domain&#8217;ini veya <code>Bildirim<\/code> domain&#8217;ini tetikleyebilir.<\/p>\n<p>Domain olaylar\u0131, sistemin i\u00e7indeki bile\u015fenleri birbirine gev\u015fek bir \u015fekilde ba\u011flar ve ayn\u0131 ba\u011flam i\u00e7inde yan etkilerin (side effects) y\u00f6netilmesine yard\u0131mc\u0131 olur. Genellikle senkron veya in-process bir olay veriyolu (event bus) arac\u0131l\u0131\u011f\u0131yla i\u015flenirler.<\/p>\n<pre><code class=\"language-csharp\">\npublic interface IDomainEvent { }\n\npublic class SiparisOlu\u015fturulduEvent : IDomainEvent\n{\n    public Guid SiparisId { get; }\n    public Guid MusteriId { get; }\n    public decimal ToplamFiyat { get; }\n    public DateTime Olu\u015fturulmaTarihi { get; }\n\n    public SiparisOlu\u015fturulduEvent(Guid siparisId, Guid musteriId, decimal toplamFiyat, DateTime olusturulmaTarihi)\n    {\n        SiparisId = siparisId;\n        MusteriId = musteriId;\n        ToplamFiyat = toplamFiyat;\n        Olu\u015fturulmaTarihi = olusturulmaTarihi;\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Entegrasyon Olaylar\u0131 (Integration Events) Nedir?<\/h3>\n<p>Entegrasyon Olaylar\u0131, farkl\u0131 Bounded Context'ler veya farkl\u0131 mikroservisler aras\u0131nda ileti\u015fim kurmak i\u00e7in kullan\u0131l\u0131r. Bir entegrasyon olay\u0131, bir ba\u011flamdaki bir de\u011fi\u015fikli\u011fin di\u011fer ba\u011flamlar i\u00e7in de \u00f6nemli oldu\u011funu ve onlar\u0131n tepki vermesi gerekti\u011fini belirtir. \u00d6rne\u011fin, \"Sipari\u015f Y\u00f6netimi\" servisindeki bir <code>Sipari\u015fOlu\u015fturuldu<\/code> domain olay\u0131, \"\u00d6deme\" servisine <code>OdemeTalebiOlu\u015fturuldu<\/code> entegrasyon olay\u0131n\u0131 tetikleyebilir. Entegrasyon olaylar\u0131, genellikle bir mesaj kuyru\u011fu (RabbitMQ, Kafka, Azure Service Bus vb.) arac\u0131l\u0131\u011f\u0131yla asenkron olarak iletilir.<\/p>\n<p>Entegrasyon olaylar\u0131, da\u011f\u0131t\u0131k sistemlerdeki nihai tutarl\u0131l\u0131\u011f\u0131 (eventual consistency) sa\u011flaman\u0131n anahtar\u0131d\u0131r. Bir servis bir entegrasyon olay\u0131n\u0131 yay\u0131mlad\u0131\u011f\u0131nda, di\u011fer servislerin bu olay\u0131 i\u015fleyip i\u015flemeyece\u011fini veya ne zaman i\u015fleyece\u011fini garanti etmez, sadece olay\u0131 duyurur.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Entegrasyon olaylar\u0131 genellikle daha geneldir ve birden fazla servisi ilgilendirir.\npublic class SiparisOlusturulduIntegrationEvent\n{\n    public Guid SiparisId { get; }\n    public Guid MusteriId { get; }\n    public IEnumerable<UrunBilgisi> Urunler { get; }\n    public decimal ToplamTutar { get; }\n\n    public SiparisOlusturulduIntegrationEvent(Guid siparisId, Guid musteriId, IEnumerable<UrunBilgisi> urunler, decimal toplamTutar)\n    {\n        SiparisId = siparisId;\n        MusteriId = musteriId;\n        Urunler = urunler;\n        ToplamTutar = toplamTutar;\n    }\n}\n\npublic class UrunBilgisi\n{\n    public Guid UrunId { get; set; }\n    public int Miktar { get; set; }\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>\u0130ki T\u00fcr Olay Aras\u0131ndaki Farklar ve Kullan\u0131m Senaryolar\u0131<\/h3>\n<p>A\u015fa\u011f\u0131daki tablo, domain olaylar\u0131 ve entegrasyon olaylar\u0131 aras\u0131ndaki temel farklar\u0131 \u00f6zetlemektedir:<\/p>\n<table>\n<thead>\n<tr>\n<th>\u00d6zellik<\/th>\n<th>Domain Olaylar\u0131<\/th>\n<th>Entegrasyon Olaylar\u0131<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><b>Kapsam<\/b><\/td>\n<td>Ayn\u0131 Bounded Context\/Servis i\u00e7inde<\/td>\n<td>Farkl\u0131 Bounded Context'ler\/Servisler aras\u0131nda<\/td>\n<\/tr>\n<tr>\n<td><b>Ama\u00e7<\/b><\/td>\n<td>\u0130\u00e7 tutarl\u0131l\u0131k, yan etkileri y\u00f6netme<\/td>\n<td>Servisler aras\u0131 ileti\u015fim, nihai tutarl\u0131l\u0131k<\/td>\n<\/tr>\n<tr>\n<td><b>\u0130leti\u015fim<\/b><\/td>\n<td>Genellikle senkron, in-process (MediatR gibi)<\/td>\n<td>Asenkron, mesaj kuyruklar\u0131 (RabbitMQ, Kafka)<\/td>\n<\/tr>\n<tr>\n<td><b>Teslim Garantisi<\/b><\/td>\n<td>Genellikle g\u00fc\u00e7l\u00fc (i\u015flem i\u00e7inde)<\/td>\n<td>At least once, nihai tutarl\u0131l\u0131k<\/td>\n<\/tr>\n<tr>\n<td><b>Veri \u0130\u00e7eri\u011fi<\/b><\/td>\n<td>Domain modeline \u00f6zg\u00fc, zengin<\/td>\n<td>Servisler aras\u0131 anla\u015fmay\u0131 sa\u011flayan, daha az detayl\u0131<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Mesaj Kuyruklar\u0131 ve Olay Veriyollar\u0131 (Message Buses)<\/h2>\n<p>Olay tabanl\u0131 mimarinin temel ta\u015f\u0131, olaylar\u0131n g\u00fcvenilir ve asenkron bir \u015fekilde iletilmesini sa\u011flayan mesajla\u015fma altyap\u0131s\u0131d\u0131r. Bu altyap\u0131 genellikle mesaj kuyruklar\u0131 veya olay veriyollar\u0131 (message buses) \u015feklinde kar\u015f\u0131m\u0131za \u00e7\u0131kar.<\/p>\n<h3>Neden Mesaj Kuyruklar\u0131 Kullanmal\u0131y\u0131z?<\/h3>\n<p>Mesaj kuyruklar\u0131, da\u011f\u0131t\u0131k sistemlerde ileti\u015fimi sa\u011flamak i\u00e7in kritik \u00f6neme sahiptir. Temel nedenler \u015funlard\u0131r:<\/p>\n<ul>\n<li><b>Asenkron \u0130leti\u015fim:<\/b> G\u00f6nderici, mesaj\u0131 g\u00f6nderdikten sonra al\u0131c\u0131n\u0131n mesaj\u0131 i\u015fleyip i\u015flemedi\u011fini beklemez. Bu, sistemin genel yan\u0131t s\u00fcresini iyile\u015ftirir.<\/li>\n<li><b>Y\u00fck Dengeleme ve \u00d6l\u00e7eklenebilirlik:<\/b> Bir kuyru\u011fa gelen mesajlar, birden fazla t\u00fcketici taraf\u0131ndan paralel olarak i\u015flenebilir. Bu, sistemin yo\u011fun y\u00fcklere daha iyi dayanmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><b>Dayan\u0131kl\u0131l\u0131k ve G\u00fcvenilirlik:<\/b> Mesajlar, t\u00fcketiciler onlar\u0131 i\u015fleyene kadar kuyrukta kal\u0131r. T\u00fcketici ar\u0131zalansa bile mesajlar kaybolmaz ve sistem yeniden aya\u011fa kalkt\u0131\u011f\u0131nda i\u015flenmeye devam eder.<\/li>\n<li><b>Ay\u0131rma (Decoupling):<\/b> \u00dcreticiler ve t\u00fcketiciler birbirlerinden ba\u011f\u0131ms\u0131z olarak geli\u015ftirilebilir, da\u011f\u0131t\u0131labilir ve y\u00f6netilebilir.<\/li>\n<\/ul>\n<h3>Pop\u00fcler Mesaj Kuyru\u011fu Teknolojileri (.NET Ekosisteminde)<\/h3>\n<p>.NET geli\u015ftiricileri i\u00e7in bir\u00e7ok g\u00fc\u00e7l\u00fc mesaj kuyru\u011fu teknolojisi mevcuttur:<\/p>\n<ul>\n<li><b>RabbitMQ:<\/b> A\u00e7\u0131k kaynakl\u0131, pop\u00fcler bir mesaj broker'\u0131d\u0131r. AMQP protokol\u00fcn\u00fc kullan\u0131r ve esnek y\u00f6nlendirme, dayan\u0131kl\u0131l\u0131k ve y\u00fcksek performans sunar. .NET i\u00e7in <a href=\"https:\/\/www.rabbitmq.com\/dotnet.html\">RabbitMQ .NET client<\/a> mevcuttur.<\/li>\n<li><b>Apache Kafka:<\/b> Y\u00fcksek performansl\u0131, da\u011f\u0131t\u0131k bir ak\u0131\u015f platformudur. \u00d6zellikle b\u00fcy\u00fck veri ak\u0131\u015flar\u0131n\u0131 i\u015flemek ve olay g\u00fcnl\u00fc\u011f\u00fc (event log) tutmak i\u00e7in tasarlanm\u0131\u015ft\u0131r. .NET i\u00e7in <a href=\"https:\/\/github.com\/confluentinc\/confluent-kafka-dotnet\">Confluent.Kafka<\/a> gibi client'lar bulunur.<\/li>\n<li><b>Azure Service Bus:<\/b> Microsoft Azure bulut platformunun bir par\u00e7as\u0131d\u0131r. Y\u00f6netilen bir mesajla\u015fma hizmeti olup, y\u00fcksek g\u00fcvenilirlik, geli\u015fmi\u015f \u00f6zellikler (mesaj oturumlar\u0131, zamanlanm\u0131\u015f mesajlar) sunar.<\/li>\n<li><b>Amazon SQS\/SNS:<\/b> AWS ekosistemindeki mesajla\u015fma hizmetleridir. SQS (Simple Queue Service) kuyruk tabanl\u0131, SNS (Simple Notification Service) ise yay\u0131nlama\/abone olma modeline dayal\u0131d\u0131r.<\/li>\n<li><b>MassTransit \/ NServiceBus:<\/b> Bu k\u00fct\u00fcphaneler, .NET uygulamalar\u0131nda mesajla\u015fma altyap\u0131s\u0131n\u0131 soyutlayan ve kolayla\u015ft\u0131ran y\u00fcksek seviyeli \u00e7er\u00e7evelerdir. RabbitMQ, Azure Service Bus gibi farkl\u0131 mesaj broker'lar\u0131n\u0131 desteklerler ve da\u011f\u0131t\u0131k i\u015flem y\u00f6netimi, yeniden denemeler, hata kuyruklar\u0131 gibi geli\u015fmi\u015f \u00f6zellikler sunarlar.<\/li>\n<\/ul>\n<h3>Olay Veriyolu (Event Bus) Uygulamalar\u0131<\/h3>\n<p>Bir olay veriyolu (event bus), olay \u00fcreticileri ile t\u00fcketicileri aras\u0131ndaki ileti\u015fimi soyutlayan bir aray\u00fczd\u00fcr. Bu, \u00f6zellikle domain olaylar\u0131 i\u00e7in servis i\u00e7i (in-process) ileti\u015fimi y\u00f6netmek i\u00e7in kullan\u0131\u015fl\u0131d\u0131r. .NET'te MediatR gibi k\u00fct\u00fcphaneler, bu t\u00fcr bir olay veriyolu i\u015flevselli\u011fini sa\u011flayabilir. Entegrasyon olaylar\u0131 i\u00e7in ise genellikle MassTransit veya NServiceBus gibi daha kapsaml\u0131 k\u00fct\u00fcphaneler veya do\u011frudan mesaj kuyru\u011fu client'lar\u0131 kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Basit bir In-Process Event Bus Aray\u00fcz\u00fc\npublic interface IEventBus\n{\n    Task PublishAsync<TEvent>(TEvent @event) where TEvent : IDomainEvent;\n    void Subscribe<TEvent, THandler>() \n        where TEvent : IDomainEvent\n        where THandler : IEventHandler<TEvent>;\n}\n\n\/\/ Bir MediatR kullan\u0131m\u0131 \u00f6rne\u011fi (IEventBus yerine)\n\/\/ MediatR, Notification Pattern ile IDomainEvent'leri dispatch edebilir.\npublic class SiparisService\n{\n    private readonly IMediator _mediator;\n\n    public SiparisService(IMediator mediator)\n    {\n        _mediator = mediator;\n    }\n\n    public async Task SiparisOlustur(SiparisOlusturCommand command)\n    {\n        \/\/ ... Sipari\u015f olu\u015fturma mant\u0131\u011f\u0131 ...\n        var siparis = new Siparis(command.MusteriId, command.Urunler);\n        \/\/ ... Sipari\u015f veritaban\u0131na kaydedilir ...\n\n        \/\/ Domain olay\u0131n\u0131 yay\u0131mla\n        await _mediator.Publish(new SiparisOlu\u015fturulduEvent(siparis.Id, siparis.MusteriId, siparis.ToplamFiyat, DateTime.UtcNow));\n    }\n}\n\n\/\/ Domain Olay\u0131 \u0130\u015fleyicisi\npublic class SiparisOlu\u015fturulduEventHandler : INotificationHandler<SiparisOlu\u015fturulduEvent>\n{\n    public Task Handle(SiparisOlu\u015fturulduEvent notification, CancellationToken cancellationToken)\n    {\n        Console.WriteLine($\"Sipari\u015f {notification.SiparisId} olu\u015fturuldu. M\u00fc\u015fteri: {notification.MusteriId}\");\n        \/\/ Stok g\u00fcncelleme, bildirim g\u00f6nderme gibi yan etkiler burada tetiklenebilir.\n        return Task.CompletedTask;\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h2>Olay Tabanl\u0131 Mimariyi Tasarlama \u0130lkeleri<\/h2>\n<p>Olay tabanl\u0131 bir mimari tasarlarken dikkat edilmesi gereken baz\u0131 \u00f6nemli ilkeler vard\u0131r. Bu ilkeler, sisteminizin sa\u011flam, g\u00fcvenilir ve s\u00fcrd\u00fcr\u00fclebilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Olaylar\u0131n Tasar\u0131m\u0131 ve Veri Modeli<\/h3>\n<p>Olaylar, sistemdeki \u00f6nemli durum de\u011fi\u015fikliklerini temsil etti\u011finden, do\u011fru tasarlanmalar\u0131 kritik \u00f6neme sahiptir. Bir olay, meydana gelen olay\u0131 a\u00e7\u0131klayan bir isimle adland\u0131r\u0131lmal\u0131d\u0131r (ge\u00e7mi\u015f zaman kipiyle, \u00f6rn: <code>Sipari\u015fOlu\u015fturuldu<\/code>, <code>UrunStokGuncellendi<\/code>). Olay\u0131n i\u00e7eri\u011fi, olay\u0131 i\u015flemek i\u00e7in gerekli t\u00fcm verileri i\u00e7ermelidir, ancak gereksiz detaylardan ka\u00e7\u0131n\u0131lmal\u0131d\u0131r. Olaylar de\u011fi\u015fmez (immutable) olmal\u0131d\u0131r, yani yay\u0131mland\u0131ktan sonra i\u00e7eri\u011fi de\u011fi\u015ftirilemez. Bu, olaylar\u0131n birer ger\u00e7ek olarak kabul edilmesini ve tutarl\u0131l\u0131\u011f\u0131n\u0131 garanti eder.<\/p>\n<h3>Atomiklik ve Tutarl\u0131l\u0131k (Eventual Consistency)<\/h3>\n<p>Da\u011f\u0131t\u0131k sistemlerde \"atomik i\u015flem\" (atomic transaction) kavram\u0131, monolitik sistemlerdeki gibi kolayca sa\u011flanamaz. Olay tabanl\u0131 mimaride genellikle \"nihai tutarl\u0131l\u0131k\" (eventual consistency) ilkesi benimsenir. Bu, bir olay\u0131n yay\u0131mland\u0131ktan sonra, ilgili t\u00fcm t\u00fcketicilerin bu olay\u0131 i\u015fleyip sistemin nihai olarak tutarl\u0131 bir duruma gelmesinin biraz zaman alabilece\u011fi anlam\u0131na gelir. Bu gecikme, sistemin \u00f6l\u00e7eklenebilirli\u011fini ve esnekli\u011fini art\u0131r\u0131rken, geli\u015ftiricilerin bu durumu g\u00f6z \u00f6n\u00fcnde bulundurarak uygulamalar\u0131n\u0131 tasarlamalar\u0131n\u0131 gerektirir. \u00d6rne\u011fin, bir sipari\u015f olu\u015fturuldu\u011funda stok hemen g\u00fcncellenmeyebilir, ancak k\u0131sa bir s\u00fcre sonra g\u00fcncellenecektir.<\/p>\n<h3>Hata Y\u00f6netimi ve Idempotency<\/h3>\n<p>Mesajla\u015fma sistemlerinde mesajlar\u0131n \"en az bir kez\" teslim edilmesi garantisi yayg\u0131nd\u0131r. Bu, ayn\u0131 mesaj\u0131n birden fazla kez teslim edilebilece\u011fi anlam\u0131na gelir. Bu durumu y\u00f6netmek i\u00e7in olay t\u00fcketicilerinin \"idempotent\" olmas\u0131 gerekir. Idempotent bir i\u015flem, ayn\u0131 girdilerle birden fazla kez \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda sistem \u00fczerinde ayn\u0131 etkiyi yarat\u0131r. \u00d6rne\u011fin, bir stok azaltma i\u015flemi, ayn\u0131 sipari\u015f i\u00e7in birden fazla kez \u00e7a\u011fr\u0131lsa bile sto\u011fu sadece bir kez azaltmal\u0131d\u0131r. Bu genellikle benzersiz bir i\u015flem kimli\u011fi (transaction ID) kullanarak veya i\u015flem durumunu kontrol ederek sa\u011flan\u0131r.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Idempotency \u00f6rne\u011fi: \u0130\u015flenmi\u015f olaylar\u0131 takip etme\npublic class StokGuncelleEventHandler : IEventHandler<SiparisOlu\u015fturulduIntegrationEvent>\n{\n    private readonly IProcessedEventsRepository _processedEventsRepository;\n\n    public StokGuncelleEventHandler(IProcessedEventsRepository processedEventsRepository)\n    {\n        _processedEventsRepository = processedEventsRepository;\n    }\n\n    public async Task Handle(SiparisOlu\u015fturulduIntegrationEvent @event)\n    {\n        \/\/ Olay\u0131n daha \u00f6nce i\u015flenip i\u015flenmedi\u011fini kontrol et\n        if (await _processedEventsRepository.IsEventProcessedAsync(@event.SiparisId, nameof(StokGuncelleEventHandler)))\n        {\n            Console.WriteLine($\"Olay {@event.SiparisId} daha \u00f6nce i\u015flenmi\u015f. Atlan\u0131yor.\");\n            return; \/\/ Olay zaten i\u015flenmi\u015f, tekrar i\u015flemeye gerek yok.\n        }\n\n        \/\/ Stok g\u00fcncelleme mant\u0131\u011f\u0131\n        Console.WriteLine($\"Sipari\u015f {@event.SiparisId} i\u00e7in stok g\u00fcncelleniyor.\");\n        \/\/ ... stok azaltma i\u015flemi ...\n\n        \/\/ Olay\u0131n i\u015flendi\u011fini i\u015faretle\n        await _processedEventsRepository.MarkEventAsProcessedAsync(@event.SiparisId, nameof(StokGuncelleEventHandler));\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h2>C# ve .NET'te Uygulama \u00d6rnekleri<\/h2>\n<p>Olay tabanl\u0131 mimariyi .NET uygulamalar\u0131nda hayata ge\u00e7irmek i\u00e7in \u00e7e\u015fitli yakla\u015f\u0131mlar ve k\u00fct\u00fcphaneler mevcuttur. \u0130\u015fte baz\u0131 temel uygulama \u00f6rnekleri.<\/p>\n<h3>Basit Bir Domain Olay\u0131 Tan\u0131mlama<\/h3>\n<p>Daha \u00f6nce g\u00f6sterildi\u011fi gibi, bir domain olay\u0131 basit bir POCO (Plain Old CLR Object) olabilir ve genellikle bir aray\u00fcz\u00fc uygular.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ IDomainEvent aray\u00fcz\u00fc (marker interface)\npublic interface IDomainEvent { }\n\n\/\/ Ger\u00e7ek bir domain olay\u0131 s\u0131n\u0131f\u0131\npublic class UrunFiyatiDegistiEvent : IDomainEvent\n{\n    public Guid UrunId { get; }\n    public decimal EskiFiyat { get; }\n    public decimal YeniFiyat { get; }\n    public DateTime DegisimTarihi { get; }\n\n    public UrunFiyatiDegistiEvent(Guid urunId, decimal eskiFiyat, decimal yeniFiyat, DateTime degisimTarihi)\n    {\n        UrunId = urunId;\n        EskiFiyat = eskiFiyat;\n        YeniFiyat = yeniFiyat;\n        DegisimTarihi = degisimTarihi;\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Olay Yay\u0131mlama ve T\u00fcketme Mekanizmas\u0131<\/h3>\n<p>Domain olaylar\u0131 i\u00e7in genellikle in-process bir olay veriyolu kullan\u0131l\u0131r. MediatR, bu konuda olduk\u00e7a pop\u00fcler bir k\u00fct\u00fcphanedir. Entegrasyon olaylar\u0131 i\u00e7in ise bir mesaj kuyru\u011fu client'\u0131 veya MassTransit gibi bir soyutlama k\u00fct\u00fcphanesi tercih edilir.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ MediatR ile Domain Olay\u0131 Yay\u0131mlama (Publishing)\n\/\/ Bir servis i\u00e7inde\npublic class UrunService\n{\n    private readonly IMediator _mediator;\n\n    public UrunService(IMediator mediator)\n    {\n        _mediator = mediator;\n    }\n\n    public async Task FiyatGuncelle(Guid urunId, decimal yeniFiyat)\n    {\n        \/\/ ... \u00dcr\u00fcn\u00fc veritaban\u0131ndan \u00e7ek, eski fiyat\u0131 al ...\n        decimal eskiFiyat = 100m; \/\/ \u00d6rnek\n        \/\/ ... Fiyat\u0131 g\u00fcncelle, veritaban\u0131na kaydet ...\n\n        \/\/ Domain olay\u0131n\u0131 yay\u0131mla\n        await _mediator.Publish(new UrunFiyatiDegistiEvent(urunId, eskiFiyat, yeniFiyat, DateTime.UtcNow));\n    }\n}\n\n\/\/ MediatR ile Domain Olay\u0131 T\u00fcketme (Handling)\n\/\/ Bir handler s\u0131n\u0131f\u0131\npublic class UrunFiyatiDegistiEventHandler : INotificationHandler<UrunFiyatiDegistiEvent>\n{\n    public Task Handle(UrunFiyatiDegistiEvent notification, CancellationToken cancellationToken)\n    {\n        Console.WriteLine($\"\u00dcr\u00fcn {notification.UrunId} fiyat\u0131 {notification.EskiFiyat}'tan {notification.YeniFiyat}'a de\u011fi\u015fti.\");\n        \/\/ Fiyat de\u011fi\u015fti\u011finde yap\u0131lacak di\u011fer i\u015flemler (\u00f6rn: indirimleri g\u00fcncelle, bildirim g\u00f6nder)\n        return Task.CompletedTask;\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>RabbitMQ ile Entegrasyon Olaylar\u0131 (Konsept)<\/h3>\n<p>Entegrasyon olaylar\u0131 i\u00e7in RabbitMQ gibi bir mesaj broker'\u0131 kullan\u0131l\u0131r. MassTransit gibi k\u00fct\u00fcphaneler, bu s\u00fcreci basitle\u015ftirir.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ MassTransit ile Entegrasyon Olay\u0131 Yay\u0131mlama\npublic class SiparisService\n{\n    private readonly IBus _bus; \/\/ MassTransit IBus instance'\u0131\n\n    public SiparisService(IBus bus)\n    {\n        _bus = bus;\n    }\n\n    public async Task SiparisTamamlandi(Guid siparisId, Guid musteriId, decimal toplamTutar)\n    {\n        \/\/ ... Sipari\u015fin tamamland\u0131\u011f\u0131na dair i\u015flemler ...\n\n        \/\/ Entegrasyon olay\u0131n\u0131 yay\u0131mla\n        await _bus.Publish(new SiparisTamamlandiIntegrationEvent\n        {\n            SiparisId = siparisId,\n            MusteriId = musteriId,\n            ToplamTutar = toplamTutar,\n            TamamlanmaTarihi = DateTime.UtcNow\n        });\n    }\n}\n\n\/\/ MassTransit ile Entegrasyon Olay\u0131 T\u00fcketme\npublic class SiparisTamamlandiConsumer : IConsumer<SiparisTamamlandiIntegrationEvent>\n{\n    public Task Consume(ConsumeContext<SiparisTamamlandiIntegrationEvent> context)\n    {\n        var @event = context.Message;\n        Console.WriteLine($\"Entegrasyon Olay\u0131: Sipari\u015f {@event.SiparisId} tamamland\u0131. M\u00fc\u015fteri: {@event.MusteriId}\");\n        \/\/ \u00d6rne\u011fin, m\u00fc\u015fteriye e-posta g\u00f6nder, muhasebe kayd\u0131 olu\u015ftur vb.\n        return Task.CompletedTask;\n    }\n}\n\n\/\/ Startup.cs veya Program.cs'de MassTransit konfig\u00fcrasyonu\n\/\/ builder.Services.AddMassTransit(x =>\n\/\/ {\n\/\/     x.AddConsumer<SiparisTamamlandiConsumer>();\n\/\/     x.UsingRabbitMq((context, cfg) =>\n\/\/     {\n\/\/         cfg.Host(\"rabbitmq:\/\/localhost\");\n\/\/         cfg.ReceiveEndpoint(\"siparis-tamamlandi-queue\", e =>\n\/\/         {\n\/\/             e.ConfigureConsumer<SiparisTamamlandiConsumer>(context);\n\/\/         });\n\/\/     });\n\/\/ });\n<\/pre>\n<p><\/code><\/p>\n<h2>Avantajlar\u0131, Zorluklar\u0131 ve \u00c7\u00f6z\u00fcmler<\/h2>\n<p>Olay tabanl\u0131 mimarinin sundu\u011fu pek \u00e7ok fayda olsa da, beraberinde getirdi\u011fi baz\u0131 zorluklar da vard\u0131r. Bu zorluklar\u0131 anlamak ve bunlara y\u00f6nelik \u00e7\u00f6z\u00fcmler geli\u015ftirmek, ba\u015far\u0131l\u0131 bir EDA uygulamas\u0131 i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<h3>Olay Tabanl\u0131 Mimarinin Sa\u011flad\u0131\u011f\u0131 Faydalar<\/h3>\n<ul>\n<li><b><br \/>\n","protected":false},"excerpt":{"rendered":"Modern yaz\u0131l\u0131m sistemleri, giderek artan karma\u015f\u0131kl\u0131k, \u00f6l\u00e7eklenebilirlik ve esneklik gereksinimleriyle kar\u015f\u0131 kar\u015f\u0131yad\u0131r. Bu ba\u011flamda, geleneksel &#8230;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1340],"tags":[],"class_list":{"0":"post-36849","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-net","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>C# Mimarisinde Ustal\u0131k: .NET&#039;te Olay Tabanl\u0131 Mimari (Mesajla\u015fma ile Temiz S\u0131n\u0131rlar) - B\u00f6l\u00fcm 12 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C# Mimarisinde Ustal\u0131k: .NET&#039;te Olay Tabanl\u0131 Mimari (Mesajla\u015fma ile Temiz S\u0131n\u0131rlar) - B\u00f6l\u00fcm 12\" \/>\n<meta property=\"og:description\" content=\"Modern yaz\u0131l\u0131m sistemleri, giderek artan karma\u015f\u0131kl\u0131k, \u00f6l\u00e7eklenebilirlik ve esneklik gereksinimleriyle kar\u015f\u0131 kar\u015f\u0131yad\u0131r. Bu ba\u011flamda, geleneksel ...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-23T21:30:44+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"C# Mimarisinde Ustal\u0131k: .NET&#8217;te Olay Tabanl\u0131 Mimari (Mesajla\u015fma ile Temiz S\u0131n\u0131rlar) &#8211; B\u00f6l\u00fcm 12\",\"datePublished\":\"2025-12-23T21:30:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/\"},\"wordCount\":2482,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\".NET\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/\",\"name\":\"C# Mimarisinde Ustal\u0131k: .NET'te Olay Tabanl\u0131 Mimari (Mesajla\u015fma ile Temiz S\u0131n\u0131rlar) - B\u00f6l\u00fcm 12 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-23T21:30:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C# Mimarisinde Ustal\u0131k: .NET&#8217;te Olay Tabanl\u0131 Mimari (Mesajla\u015fma ile Temiz S\u0131n\u0131rlar) &#8211; B\u00f6l\u00fcm 12\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"C# Mimarisinde Ustal\u0131k: .NET'te Olay Tabanl\u0131 Mimari (Mesajla\u015fma ile Temiz S\u0131n\u0131rlar) - B\u00f6l\u00fcm 12 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/","og_locale":"tr_TR","og_type":"article","og_title":"C# Mimarisinde Ustal\u0131k: .NET'te Olay Tabanl\u0131 Mimari (Mesajla\u015fma ile Temiz S\u0131n\u0131rlar) - B\u00f6l\u00fcm 12","og_description":"Modern yaz\u0131l\u0131m sistemleri, giderek artan karma\u015f\u0131kl\u0131k, \u00f6l\u00e7eklenebilirlik ve esneklik gereksinimleriyle kar\u015f\u0131 kar\u015f\u0131yad\u0131r. Bu ba\u011flamda, geleneksel ...","og_url":"https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-23T21:30:44+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"16 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"C# Mimarisinde Ustal\u0131k: .NET&#8217;te Olay Tabanl\u0131 Mimari (Mesajla\u015fma ile Temiz S\u0131n\u0131rlar) &#8211; B\u00f6l\u00fcm 12","datePublished":"2025-12-23T21:30:44+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/"},"wordCount":2482,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":[".NET"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/","url":"https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/","name":"C# Mimarisinde Ustal\u0131k: .NET'te Olay Tabanl\u0131 Mimari (Mesajla\u015fma ile Temiz S\u0131n\u0131rlar) - B\u00f6l\u00fcm 12 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-23T21:30:44+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/c-mimarisinde-ustalik-nette-olay-tabanli-mimari-mesajlasma-ile-temiz-sinirlar-bolum-12\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"C# Mimarisinde Ustal\u0131k: .NET&#8217;te Olay Tabanl\u0131 Mimari (Mesajla\u015fma ile Temiz S\u0131n\u0131rlar) &#8211; B\u00f6l\u00fcm 12"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36849","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=36849"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36849\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36849"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36849"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36849"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}