Cqrs, MediatR, AutoMapper ve Repository ile Crud Örneği
Merhaba arkadaşlar, bugün sizlere cqrs, mediator pattern(MediatR package),AutoMapper ve repository kullanarak ufak bir Crud örneği yapacağım.
Mediator pattern
Bence bu patterni en iyi açıklayan yapı en bilinen örneği. Uçaklar arası iletişimi sağlayan kule olarak düşünülebilir yani uçakların birbirleri ile iletişimi yoktur, hepsinin iletişimi kule üzerinden sağlanır. Mediator patternde buradaki kule yapısını kullanmamızı sağlar.
Bakınız: https://refactoring.guru/design-patterns/mediator
https://www.buraksenyurt.com/post/Tasarc4b1m-Desenleri-Mediator
Cqrs (Command Query Responsibility Segregation)
Bu pattern command ve querylerin yani datayı değiştiren sorgular (Create,Update,Delete) ile listeleme (Read) sorgularının ayrılması prensibi üzerine kurulmuştur. “docs.microsoft.com” adresinde bu patternin avantajı aşağıdaki şekilde özetlenmiştir.
“CQRS uygulamak performansını, ölçeklenebilirliğini ve güvenliğini en üst düzeye çıkarabilir. CQRS’ye geçirilerek oluşturulan esneklik, sistemin zaman içinde daha iyi gelişmesine olanak tanır.”
Bakınız: https://docs.microsoft.com/tr-tr/azure/architecture/patterns/cqrs
https://github.com/ducmeit1/cqrswithmediatr
https://martinfowler.com/bliki/CQRS.html
https://www.youtube.com/watch?v=KIhMeJ-jYME
Cqrs patternde command ve query storeları ayrı olarak kullanılabilir. Bu kullanımda ölçekleme ve esneklik avantajı olsa da storeların birbiri arasındaki senkronizasyon işlemlerini iyi planlamak ve yönetmek gerekir.
Command ve query aynı storedan beslenebilir. Bu kullanımda store yönetimi daha kolay olsa da ölçekleme ve esneklik tarafında bir kayıp olabilir.
Event Sourcing ile beraber cqrs pattern kullanılabilir. Doğru bir yapıda kurulduğu zaman çok avantajlı kullanımlar sunmaktadır.
Bakınız: https://medium.com/design-microservices-architecture-with-patterns/event-sourcing-pattern-in-microservices-architectures-e72bf0fc9274
https://hmh.engineering/cqrs-pattern-94c27d4b9a68
Aşağıdaki senaryolarda Cqrs kullanılabilir.
- Birçok kullanıcının aynı verilere paralel olarak eriştiği işbirliğine dayalı etki alanları
- Yazma ve Okuma logicleri ve aşamaları ayrıştırmak isteniyorsa
- Okuma Sayısının yazma sayısından çok fazla olduğu durumlarda
- Karmaşıklığa göre yazma ve okuma ekiplerinin ayrıldığı durumlarda
- Modelin birden fazla sürümünü içerebildiği ya da iş kurallarının düzenli olarak değiştiği senaryolarda.
Aşağıdaki durumlarda kullanılması önerilmez
- Basit bir etki alanı varsa
- Kompleks olmayan iş kuralları varsa
- Basit Crud operasyonları ile çözülebilecek yapılarda
“CQRS modelini yalnızca en çok değer katacağını düşündüğünüz belirli sistem bölümlerine uygulayın.” -docs.microsoft.com
Örneğimizin daha basit ve anlaşılır olması adına tek proje altında işlemleri gerçekleştireceğim. Şimdi örneğimize gelelim öncelikle MediatR ve MediatR.Extensions.Microsoft.DependencyInjection paketlerimizi kuralım. Dummy Entity ve dummy repositorimizi ekleyerek singleton olarak register edelim.
Request ve Response Modellerimizi oluşturalım.
Projemize Automapper paketini ekleyerek modellerimizi entitymize mapleyelim.
Şimdi ilgili metoda yönlendirecek handlerımızı yazalım.
Artık controller içerisinde mediator servisi inject edip kullanmamız kaldı. Bunun için program.cs / startup altına servisimizi register edelim.
Evet arkadaşlar basit bir şekilde Cqrs, MediatR, Repository ve AutoMapper’ı bir arada kullandık. Projeyi daha detaylı incelemek ve diğer operasyonlarında kodunu incelemek isterseniz github reposumu ziyaret edebilirsiniz.