Blog'a Dön
AIMeridian.NETC#CQRSOpen Source

Meridian'ı Yayınlamak: Açık Kaynak Bir .NET Mediator ve Mapper

Umut Korkmaz2026-04-087 min read

Meridian, iki NuGet paketi olarak yayınladığım küçük bir .NET kütüphanesi: CQRS tarzı süreç içi (in-process) istek işleme için Meridian.Mediator ve profiller ile sorgu projeksiyonu kullanan nesneden nesneye eşleme için Meridian.Mapping. .NET 8'den 11'e kadar hedefliyor, yüzey alanı bilinçli olarak küçük tutulmuş ve bu yardımcı araçların elle yazılmış versiyonlarını yıllarca projeden projeye taşımanın bir ürünü olarak ortaya çıktı.

Neden Yeni Bir Mediator Yayınlamalı

.NET ekosisteminin bu alanda zaten güçlü seçenekleri var. Onlarla rekabet etmek için yola çıkmadım. En çok kullandığım desenleri koruyan, hiç başvurmadıklarımı çıkaran ve herhangi bir ekibin sürtünmesiz çatallayabileceği (fork) kadar okunabilir kalan bir mediator istedim. Amaç yenilik değildi. Netlikti.

Meridian.Mediator, kullandığım neredeyse her gerçek durumu kapsayan dört desene odaklanıyor: istek ve yanıt, bildirimler (notifications), akışlar (streams) ve boru hattı davranışları (pipeline behaviors). Davranışlar, çoğu projenin telemetri, doğrulama ve önbellekleme sarmalayıcılarını büyüttüğü yer olduğundan, Meridian bunu sonradan akla gelen bir şey değil, birincil genişletme noktası yapıyor.

Neden Bir Mapper Eklemeli

Eşleme (mapping) kütüphaneleri tartışmalıdır. Bazı ekipler onlara bayılır, bazı ekipler ise onları bir hata ayıklama derdi kaynağı olarak görür. Meridian.Mapping'i ekliyorum; çünkü alternatif genellikle daha temiz bir mimari değil, birbirinden kopan elle yazılmış mapper'lardan oluşan bir klasördür. Paket; profilleri, çözücüleri (resolvers), dönüştürücüleri (converters) ve sorgu projeksiyonunu destekliyor; bunlar birlikte elle yazmanın pahalıya patladığı yerleri kapsıyor.

En çok kullandığım özellik sorgu projeksiyonu. Bir IQueryable'ı, önce tüm varlığı materyalize etmek yerine, veritabanı seviyesinde hedef bir şekle eşlemek, büyük okuma yollarında hemen getiri sağlayan basit bir değişiklik.

Yapay Zekânın Zorladığı Test Disiplini

Bir kütüphane test paketiyle yaşar ya da ölür. Meridian'ın; mediator boru hattı, işleyiciler (handlers) ve kapsamlı (scoped) servis çözümlemesi arasındaki davranış sınırı boyunca yoğun bir kapsamı var. Geliştirme sırasında kapsamlı test matrislerini üretmek için yapay zeka yardımı kullandım, sonra yüzeysel olanları gözden geçirip yeniden yazdım. Üretilen durumlar özellikle mapper için faydalıydı; orada uç durumlar kombinatoriktir ve unutması kolaydır.

Bir kuralı korudum: yapay zeka bir test taslağı çıkarır, onun bir yere hak edip etmediğine ben karar veririm. Yalnızca kapsam sayılarını şişirmek için var olan testler kesilir. Gelecekteki bakımcıların bozabileceği gerçek davranışı tanımlayan testler ise kilitlenir ve belgelenir.

Genel Yüzeyi Küçük Tutmak

Açık kaynak bir .NET kütüphanesi, kullanıcılarına bir sözleşme vaat eder. Her genel (public) API, ileride bozmaktan pişman olacağım bir şeydir. Faydalı hissettiren ama kesinlikle gerekli olmayan yardımcıları açığa çıkarma dürtüsüne direndim. İlk dahili versiyon ile ilk genel sürüm arasında birden çok metodu kırptım.

Daha küçük genel yüzey, sürümleme disiplinini de kolaylaştırdı. Dışa aktarımları tek bir sayfada listeleyebiliyorsam, her değişiklik açtığımda geriye dönük uyumluluk üzerine akıl yürütebilirim. Bu disiplin, herhangi bir tek özellikten daha değerli.

Gerçekten İş Gören Sürüm İş Akışı

Bir kütüphaneyi açık kaynak yapmanın canını yakan kısmı kod değildir. Paketlemedir. Erkenden; testleri çalıştıran, her hedef çatı (framework) için derleyen ve paketleri tutarlı meta veriyle gönderen bir sürüm iş akışına yatırım yaptım. Yapay zeka burada da yararlı oldu, çoğunlukla iş akışı tanımındaki kendi hatalarımı yakalamak için. İyi bir sürüm iş akışı, ilk iki kullanımdan sonra dikkatinizden kaybolur ve tam olarak istediğiniz de budur.

Neden Küçük Kütüphaneler Buna Değer

Çoğu projenin yeni bir mediator'a ya da yeni bir mapper'a ihtiyacı olmadığını bilecek kadar uygulama kodu sevk ettim. İhtiyaçları olan şey güvenilir olanlardır. Meridian özellikte kazanmaya çalışmıyor. Tanımadığım bir kod tabanında bulmak isteyeceğim türden bir kütüphane olmaya çalışıyor: bariz, sessiz ve uymayı bıraktığı an kolayca değiştirilebilir. Bu hedef çoğu kütüphane vaadinden daha mütevazı ve mesele de bu.