Modern .NET uygulamalarında temiz mimari oluştururken en çok kullanılan iki kütüphane olan MediatR ve FluentValidation'ın gücünü keşfedin. Bu yazıda, bu iki aracın nasıl birlikte çalıştığını ve projelerinizde nasıl implement edebileceğinizi öğreneceksiniz.

MediatR Nedir ve Ne İşe Yarar?

MediatR, yazılım tasarım desenlerinden biri olan Mediator deseninin .NET implementasyonudur. Temel olarak, uygulamanızdaki farklı bileşenler arasındaki doğrudan bağımlılıkları azaltarak, bu bileşenlerin bir aracı (mediator) üzerinden iletişim kurmasını sağlar.

Ne İşe Yarar?

  • Gevşek Bağlılık (Loose Coupling): Uygulamanızdaki sınıfların birbirlerini doğrudan çağırmak yerine MediatR aracılığıyla iletişim kurmasını sağlar. Bu sayede bir bileşendeki değişiklikler diğer bileşenleri daha az etkiler, kodu daha modüler ve yönetilebilir hale getirir.
  • İşlem Ayrımı (Separation of Concerns): Genellikle CQRS (Command Query Responsibility Segregation) deseni ile birlikte kullanılır. Bu desende, veri yazma (Command) ve veri okuma (Query) işlemleri birbirinden ayrılır. MediatR, Command ve Query nesnelerini ilgili Handler'larına yönlendirerek bu ayrımı kolaylaştırır.
  • Pipeline Davranışları (Pipeline Behaviors): MediatR, bir isteğin (request) işlenmeden önce veya sonra çalışacak ek mantıklar (örneğin, loglama, doğrulama, yetkilendirme, hata yönetimi) eklemenizi sağlayan pipeline davranışlarını destekler. Bu, ortak işlevsellikleri merkezi bir yerde tutmanıza olanak tanır.
  • Basitleştirilmiş İstek-Yanıt Mekanizması: Uygulamanızdaki bir işlemi (bir kullanıcının oluşturulması gibi) bir "istek" (örneğin CreateUserCommand) olarak tanımlar ve bu isteği işleyecek ayrı bir "işleyici" (handler) oluşturursunuz. MediatR, isteği uygun işleyiciye yönlendirir ve işleyiciden dönen yanıtı geri verir.
  • Bildirimler (Notifications): Bir olayın birden fazla alıcı tarafından işlenmesi gerektiği durumlarda (örneğin, bir ürün oluşturulduğunda hem stok servisine hem de bildirim servisine haber vermek) MediatR'ın bildirim mekanizması kullanılabilir. Bir olayı yayınlarsınız ve bu olaya abone olan tüm işleyiciler eş zamanlı olarak çalışır.

Kullanım Senaryoları:

  • API'lerde İş Akış Yönetimi: Bir API isteğinin alınmasından veritabanına kaydedilmesine kadar olan tüm adımları (validasyon, iş mantığı, veritabanı işlemleri) MediatR aracılığıyla yönetmek.
  • CQRS Mimarileri: Okuma ve yazma işlemlerini ayrı ayrı ele alarak uygulamanın performansını ve ölçeklenebilirliğini artırmak.
  • Etki Alanı Olayları (Domain Events): Bir iş kuralı tetiklendiğinde birden fazla bağımsız işlemin gerçekleşmesi gerektiğinde (örneğin, sipariş oluşturulduğunda envanteri güncelleme ve müşteriye e-posta gönderme).

FluentValidation Nedir ve Ne İşe Yarar?

FluentValidation, .NET için güçlü ve tip güvenli bir doğrulama kütüphanesidir. Veri doğrulama kurallarını açık ve okunabilir bir şekilde tanımlamanızı sağlar. Geleneksel Data Annotations'lara kıyasla daha esnek ve güçlü bir yapı sunar.

Ne İşe Yarar?

  • Okunabilir ve Bakımı Kolay Doğrulama Kuralları: Doğrulama kurallarını "Fluent Interface" deseni kullanarak tanımlamanıza olanak tanır. Bu sayede kurallar zincirleme metot çağrılarıyla yazılır ve okunması kolay bir yapı oluşturur.
  • Tip Güvenli Doğrulama: Doğrulama kuralları belirli bir model veya nesne tipi için tanımlanır, bu da derleme zamanı hatalarını azaltır ve güvenliği artırır.
  • Esneklik: Yerleşik birçok doğrulama kuralının yanı sıra, kendi özel doğrulama kurallarınızı da kolayca yazmanıza imkan tanır. Karmaşık iş kurallarını doğrulamak için idealdir.
  • Otomatik ve Manuel Doğrulama: ASP.NET Core gibi framework'lerle entegre olarak modellerin otomatik olarak doğrulanmasını sağlayabildiği gibi, validator'ları manuel olarak çağırıp doğrulamayı istediğiniz yerde de yapabilirsiniz.
  • Ayrı Doğrulama Mantığı: Doğrulama mantığını iş mantığından ayırmayı teşvik eder. Her model için ayrı bir AbstractValidator sınıfı oluşturarak kodunuzu daha düzenli hale getirirsiniz.

Kullanım Senaryoları:

  • API Giriş Verilerini Doğrulama: Bir API'ye gelen istek gövdelerinin (request body) veya sorgu parametrelerinin (query parameters) belirli kurallara uygun olup olmadığını kontrol etmek (örneğin, zorunlu alanlar, e-posta formatı, sayısal aralıklar).
  • Form Doğrulama: Kullanıcıdan alınan form verilerinin sunucu tarafında doğrulanması.
  • İş Kuralı Doğrulaması: Bir işlem başlamadan önce belirli iş kurallarının (örneğin, bir ürünün fiyatının pozitif olması, sipariş miktarının stok miktarından fazla olmaması) karşılandığını doğrulamak.
  • Model Dışı Veri Doğrulama: Veritabanından gelen veya üçüncü taraf bir servisten alınan verilerin belirli formatlara uygunluğunu kontrol etmek.

MediatR ve FluentValidation Birlikte Nasıl Kullanılır?

Bu iki kütüphane, genellikle MediatR'ın pipeline davranışları özelliği sayesinde birlikte kullanılır. İşleyiş şöyledir:

1

Command/Query Oluşturma

Bir MediatR Command veya Query'si oluşturulur (örneğin CreateProductCommand).

2

Validator Tanımlama

Bu Command veya Query için FluentValidation kullanarak bir Validator (örneğin CreateProductCommandValidator) yazılır ve doğrulama kuralları tanımlanır.

3

Pipeline Behavior Ekleme

MediatR pipeline'ına bir Validation Behavior (doğrulama davranışı) eklenir. Bu davranış, herhangi bir Command veya Query ilgili Handler'ına ulaşmadan önce otomatik olarak FluentValidation tarafından tanımlanmış doğrulama kurallarını çalıştırır.

4

Otomatik Doğrulama

Eğer doğrulama başarısız olursa, istek işleyiciye ulaşmadan durdurulur ve doğrulama hataları döndürülür. Bu sayede iş mantığı yalnızca geçerli verilerle çalışır.

Sonuç

Bu kombinasyon, uygulamanızda temiz, düzenli, kolay test edilebilir ve esnek bir mimari oluşturmanıza yardımcı olur. MediatR iş akışını yönetirken, FluentValidation bu akışa giren verilerin kalitesini ve doğruluğunu garanti eder.

Sonuç

MediatR ve FluentValidation, modern .NET uygulamalarında clean architecture prensiplerine uygun, sürdürülebilir ve test edilebilir kod yazmak için vazgeçilmez araçlardır. Bu iki kütüphaneyi birlikte kullanarak, hem kod kalitesini artırabilir hem de geliştirme sürecinizi hızlandırabilirsiniz.

Gelecek yazılarımda, bu kütüphanelerin pratik implementasyonlarını kod örnekleriyle detaylandıracağım. Takipte kalın!