Mediatr Nedir?

Eren Yılmaz
4 min readMar 14, 2022

--

Selamlar, yeni bir içerik ile sizlerleyim. Bu aralar CQRS pattern ve uygulanış şekilleri ile ilgili araştırmalar yapıyorum. Bu süreçte belli bir seviyede bilgi sahibi olduğum mediatr kütüphanesinde de derinlere inme fırsatım oldu. Ben de hem öğrendiklerimi bir proje üzerinde uygulayabilmek hem de bu bilgileri başkaları ile paylaşabilmek adına bir projeye geliştirmeye, ve bu projeyi de geliştirirken makale serisi olarak paylaşmaya karar verdim. Eğer konu ilginizi çekerse makale serisini takip etmenizi öneririm.

Proje en genel hatlarıyla CQRS tasarım deseninin uygulanacağı örnek bir proje olacak, ve aktif olarak mediatr kütüphanesi kullanılacak. Daha fazla detayı bir sonraki makalede paylaşacağım.

Projeyi 4 makaleden oluşan bir seri olarak paylaşmayı düşünüyorum.Bu ilk makalede projede kullanılacak olan mediatr kütüphanesini ve bize sunduğu mekanizmaları inceleyeceğiz. İkinci makalede detaylı bir şekilde proje yapısına göz atacağız. Son iki makalede ise projenin kodlamasını gerçekleştireceğiz.

Yol haritamızı netleştirdiğimize göre asıl konumuza geçebiliriz. 😊

MediatR Nedir?

Öncelikle, olaya temelden başlayarak ilerlemeye çalışalım. Geliştirdiğimiz projelerde birbiri ile ilişkili birden fazla obje olabiliyor. Bu objelerin birbirleri ile ilişkileri de olabiliyor. Böyle bir projede bu objelerin yönetimi ciddi bir sorumluluk demektir.

İşte böyle bir projede, bu objelerin yönetimini birbirinden farklı yöntemlerle gerçekleştirebiliriz. Akla ilk gelen yöntemlerden biri, gelen isteğe göre doğrudan ilişkili obje ile iletişime geçmektir. Yine ihtiyaç durumuna göre bu objelerin içerisinde diğer ilişkili objeler ile iletişime geçilebilir. Bu şekilde bir obje yönetimini aşağıdaki şekil çok iyi bir şekilde açıklamaktadır.

Bu yapının dezavantajı nedir diye soracak olursak, objelerin sayısı arttıkça yönetiminin zorlaşması diyebiliriz. Peki bu yönetim işini başka nasıl uygulayabiliriz?

Yukarıdaki soruna çözüm olması amacıyla, “Mediator” adı verilen tasarım deseni ortaya atılmıştır. Mediator pattern, objelerin yönetiminin merkezi bir noktadan yapılmasını savunur. Bu sayede tek bir merkezden objelerin yönetimini gerçekleştirebiliriz. Ayrıca hangi durumda hangi objenin kullanılacağı sorumluluğunu da bu merkezi yapıya yükleyerek, karmaşıklığı çok aza indirip kullanımı kolaylaştırabiliyoruz. Buradaki merkezi yapı, yazılım projelerinde bir sınıfa karşılık gelmektedir, ve bu sınıfa Mediator adı verilir. Böylece hangi istek gelirse gelsin, ilgili bilgileri mediator objesine iletmemiz yeterlidir, gerisini bizim için o halledecektir. Mediator patternin uygulandığı bir yönetim şekli aşağıdaki şekle dönüşür.

Evet, artık mediatr’dan bahsedebiliriz. Projelerimizde mediator patterni uygulamak için kendimiz bir yapı kurabiliriz, veya bizim için hazırlanmış olan kütüphaneleri kullanabiliriz. Artık olayı tahmin edebildiğiniz üzere, .Net platformunda bizim için hazır bir mediator pattern yapısı sunan bir kütüphane mevcut; mediatr.

MediatR kütüphanesinde bize sunulmuş bir çok yapı mevcut, ancak bu yapıları zaten geliştireceğimiz proje üzerinde kullanacağımız için bu makalede sadece ne olduklarından bahsedeceğim.

Send/Publish

En başta bahsedeceğimiz konu, mediatr üzerindeki send/publish mekanizması olacak. Send, mediatr üzerinde bir bilginin ilgili bir objeye gönderildiğini belirten methottur. Mesaj iletimi için kullanılır. Gönderilecek olan mesaj, IRequest arayüzünü implemente eder. Geriye değer dönmeyen mesajlar için IRequest arayüzünü, geriye değer dönen mesajlar için ise jenerik olan IRequest<> arayüzünü kullanabiliriz. Mediatr, gönderilen mesajın hangi objeyle ilişkili olduğunu belirlemek için IRequestHandler<> arayüzünü kullanır. Burada gönderilen mesajın işleneceği objeye handler denmekte, ve bu arayüzü implemente etmelidir. Bu sayede mediatr, reflection kullanarak hangi request objeleri için hangi handler objelerinin çalıştırılacağını belirler. Bize ise sadece ilgili request objesini mediator objesine göndermek kalır.

Publish, mediatr üzerindeki bir başka mekanizmadır. Sendden farklı olarak, bir durum bildirme, yani event fırlatma amacıyla kullanılır. Publish methotuyla bir durum bildirildiğinde, o durumu dinleyen tüm objeler tetiklenecektir. Haliyle send için gönderilen mesajı handle eden bir obje mevcutken, publishde fırlatılan bir eventi birden fazla subscriber işleyebilmektedir. Publish methotu ile bildirilecek olan eventler INotification arayüzü ile işaretlenmelidir. Eventleri dinleyen objeler ise INotificationHandler<> arayüzünü implemente etmelidir.

PipelineBehavior

Mediatr, kendi içerisinde handler-subscriber objeleri arasında çalışan bir iş akışına sahiptir. Buna pipeline behavior diyoruz. Ayrıca bu yapıyı kendimize göre özelleştirebiliyoruz. Handler-Subscriber objeleri çalıştırılmadan önce ve sonra, ilgili işlemleri gerçekleştirebiliyoruz. Örneğin, handler objeleri çalıştırılmadan önce ve çalıştırıldıktan sonra loglama yapma, bir üst transaction oluşturma, hata yakalama mekanizması gibi işlemler gerçekleştirebiliriz.

Evet, mediatr kütüphanesi üzerindeki yapıları elimden geldiğince anlatmaya çalıştım. Makaleyi yazarken kullandığım kaynakları aşağıda bulabilirsiniz. Yakında mediatr kütüphanesini ve bu bahsettiğim yapıları uygulayacağımız bir projeye başlıyor olacağız ve bir sonraki makalede bu projenin detayları üzerinde duracağız. Tekrar görüşene kadar, kendinize çok iyi bakın. 😊

Kaynaklar

--

--