Altbilgi içeriğine atla
Iron Academy Logo
C# Yaygın Problemler

Alan Mantığı ve Boru Hatları ile CQRS İşleyicisi (C#) - Derek Comartin'in Videosu ile Açıklandı

Derek Comartin
8m 03s

Command Query Responsibility Segregation (CQRS) NET uygulamalarında okuma ve yazma işlemleri arasında net bir ayrım sağlar. Bu ayrım, daha iyi ölçeklenebilirlik, test edilebilirlik ve karmaşık iş mantığı üzerinde kontrol sağlar. Ancak uygulamanız büyüdükçe, C# içindeki CQRS işleyicileriniz mantıkla dolup taşabilir ve bunları sürdürmesi ve test etmesi zor hale gelir.

Derek Comartin, "Clean Up Bloated CQRS Handlers with Domain Logic & Pipelines" başlıklı bilgilendirici videosunda, bu tür CQRS komut işleyicilerini nasıl temizleyeceğini, mantığı alan modellerine kaydırarak ve komut mantığını adım adım yönetmek için bir boru hattı yapılandırarak anlatıyor. Bu yazıda, Derek'in yaklaşımını detaylı inceleyecek ve daha sürdürülebilir CQRS uygulamaları nasıl oluşturulacağını öğreneceğiz.

Aşırı Yüklenmiş İşleyicilerin Sorunu

Derek, birçok web uygulamasında yaygın bir senaryoyu, C# içinde bir CQRS işleyicisini açtığınızda, karışık olduğunu vurgulayarak başlıyor. Veri doğrulama, yetkilendirme, iş mantığı, durum geçişleri, olay yayınlama, günlük kayıt—all birbirine geçmiş.

Bunu, bir sevkıyatın gönderilmeyi planlandığındaki komut nesnesini kullanarak örneklendiriyor. İşleyici şu görevlerden sorumludur:

  • Sevkiyatı yüklemek için veri deposuna erişim sağlamak.

  • Sevkiyat durumunun hazır durumda olup olmadığını kontrol etmek.

  • Durumu güncellemek (örneğin, veriyi güncelleme).

  • Değişiklikleri geri veri erişim katmanına kaydetmek.

  • Bir e-posta göndermek.

  • Bir alan olayı yayınlamak.

Tüm bunlar tek bir yerde gerçekleşiyor. Bu, CQRS deseninin amacını ihlal eder; burada amaç endişeleri ayırmak, performansı ve sürdürülebilirliği artırmaktır.

Alandan Gelen Mantığı Veri Modeline Taşımak

Derek'in ilk adımı, doğrulama ve durum geçişi mantığını veri modeline taşımaktır. Sevk sınıfı içinde bir Dispatch() metodu oluşturur. Artık alan mantığı burada yaşayacak.

Sevk durumu işleyicide manuel olarak kontrol etmek yerine, mantık bu metod içinde kapsüllenmiştir, böylece sevk her tetiklendiğinde veri bütünlüğünü ve tutarlı davranışları garanti eder. Bu, CQRS tabanlı uygulamanızda temiz mimariyi uygulamanın anahtarıdır.

Örneğin, shipment.Dispatch() çağrılan her yerdeki tüm doğrulamalar ve durum geçişlerini otomatik olarak gerçekleştirir. Bu, CQRS tasarım kalıbıyla uyum sağlar ve işleyici ile alan mantığı arasında net bir ayrımı korur.

Merkezileştirmenin Değeri

Derek, bu tür bir değişikliğin gereksiz soyutlama eklemekle ilgili olmadığını vurgular. Bunun yerine, uygulama kodunuzun farklı kısımlarında kullanılan mantığın merkezileştirilmesiyle ilgilidir. Eğer birden fazla komut işleyici bir sevkıyat göndermeliyse, bu özel mantık bir yerde—alan modeli içinde—yaşamalıdır.

Bu, veri modelinizi daha sağlam hale getirir ve CQRS işleyici C# uygulamalarınızı daha basit ve sürdürülebilir hale getirir.

Boru Hattı Desenini Tanıtmak

Komut işleyicisini daha da temizlemek için Derek, bir boru hattı deseni tanıtır. Bu yapı, bir komutu, bir bağlam nesnesini alarak ve bir sonraki adıma bulanık bir şekilde çağırarak, küçük ve tek amaçlı adımlar dizisi olarak işlem yapar.

Bu, kavramsal olarak ASP.NET Core ara yazılımına benzerdir ve her adım akışın belirli bir bölümüne odaklanır:

  • Sevkiyatı alma (yani, veriyi okuma)

  • Gönderme (yazma işlemlerini gerçekleştirme)

  • Olaylar yayınlama

  • Verileri saklama

Bu adımlar, boru hattı boyunca akan paylaşılan bir komut nesnesi kullanır. Bu, komut ve sorgu sorumluluğu ayırmanın temiz ve modüler bir uygulanmasını oluşturur.

Boru Hattının Örnek Uygulaması

Örnek uygulamasında Derek, boru hattını şu adımlarla yapılandırır:

  • Sevkiyatı yükleme – ve veri erişim katmanından bir depodan veri çekme.

  • Sevkiyatı gönderme – Dispatch() metodunu çağırarak alan mantığını uygulama.

  • Alan olayını ekleme – "ShipmentDispatched" olayını bağlama.

  • Olayları yayımlama – dış sistemlere bilgi vermek için olayları yayma.

  • Değişiklikleri saklama – güncellemeleri veri deposuna kalıcı hale getirme.

Her adım, komut mantığının belirgin bir parçasını temsil eder, veri doğrulamasını artırır ve sorumlulukları ayrı tutar.

Derek ayrıca artık e-posta bildirimlerinin şimdi bir alan olayına tepki olarak ayrı ele alındığını belirtir. Bu, olay kaynaklama ilkelerine uyum sağlar ve nihai tutarlılığı teşvik eder.

Test Etme ve Sürdürülebilirlik Faydaları

Bu örüntünün en büyük faydalarından biri test edilebilirliktir. Büyük bir komut işleyiciyde, birkaç bağımlılığınız olabilir (örneğin, depolar, posta hizmetleri, günlük yazıcılar). Ancak işleyiciyi boru hattı adımları olarak böldüğünüzde, her biri yalnızca birkaç bağımlılığı gerektirir.

Bu modüler yaklaşım, bireysel adımları sahte olanlar veya gerekli durumlarda modelleme yaparak kolayca test etmenizi sağlar. Örneğin, Dispatch() çağıran bir adımı test ediyorsanız, bir e-posta servisini veya olay yayınlayıcısını modellemeniz gerekmez.

Bu endişelerin ayrımı, okuyucu ve yazar modellerinizi daha temiz ve daha odaklanmış hale getirir— CQRS örüntüsünün sorumluluk ayırımı modeline uygundur.

Bileşensellik ve Yeniden Kullanılabilirlik

Boru hattı yaklaşımının başka bir yararı da bileşenselliğidir. Outbox Örüntüsü gibi bir yaklaşım kullanırsanız, olayların yalnızca yazma işlemleri kalıcı hale getirildikten sonra yayınlandığından emin olabilirsiniz. Tutarlılık ve teslimat garantilerinin önemli olduğu CQRS uygulamalarında bu kontrol seviyesi esastır.

Ayrıca, farklı CQRS işleyicileri arasında adımları paylaşabilirsiniz—örneğin, genel bir "SaveChanges" veya "ValidateRequest" adımı.

Komut ve sorgu işlemini destekleyen MediatR kütüphanesi gibi araçları kullanarak, bu adımları .NET Core uygulamanızda bağımlılık enjeksiyonu yoluyla kayıt edebilirsiniz.

Bu sistemi kurmak için Visual Studio'nun Paket Yöneticisi Konsolu aracılığıyla Install-Package MediatR komutunu çalıştırabilirsiniz— C#'ta CQRS uygularken yaygın bir adımdır.

Tavizler

Derek bu yaklaşımın getirdiği artan karmaşıklığın göz ardı edilmediğini vurguluyor. Boru hatları dolaylılık tanıtır ve bir çağrı yığınına baktığınızda, bir labirentte gezinmek gibi gelebilir.

Ancak karmaşık iş mantığı için, karşılıklı verilen ödün genellikle buna değerdir. Bir işleyicinin 10'dan fazla bağımlılığı ve yüzlerce satır mantığı varsa, CQRS geliştiricilerin bu akışları daha iyi yapılandırmalarını ve sürdürmelerini sağlar.

Ne Zaman Refaktör Yapılacağına Dair Son Düşünceler

Derek, CQRS işleyici C# uygulamanızın gerçekten şişirilmiş olup olmadığını dikkatlice değerlendirmenizi hatırlatarak konuyu kapatır. Her senaryo bir boru hattı gerektirmez. Onun amacı olasılıkları göstermektir ve bu tür yapıların faydalı olup olmadığını değerlendirmek geliştiricilere kalmıştır.

Kodunuzda tutarlılığı sürdürmek, kodu daha modüler hale getirmek ve özellikle CQRS web uygulamalarında okuma ve yazma işlemlerini daha iyi yönetmek için endişe ayrımının faydalı olacağı alanlara bakmanızı önerir.

Sonuç

Derek Comartin'ın videosu, alan mantığı kapsülasyonu ve boru hatlarını kullanarak CQRS işleyicilerinin nasıl temizleneceğine dair pratik bir rehber sunar. Bu yaklaşım, kod şişmesi problemlerini çözmeye yardımcı olur, veri bütünlüğünü teşvik eder ve uygulama kodunu belirgin modellere ayırarak sürdürülebilirliği artırır.

Çalışan verilerini, ürün detaylarını veya yeni bir kullanıcı komutunu işlerken, CQRS deseniyle boru hatlarını ve alan odaklı tasarımı uygulamak, kod tabanınızı daha ölçeklenebilir, test edilebilir ve sağlam hale getirecektir.

Veri aktarım nesnelerini, ayrı modelleri kullanarak ve okuyucu ve yazar mantığı arasında net bir ayrımı koruyarak, .NET uygulamanızın daha iyi yapılandırılmış olacak ve zamanla evrimleşmesi daha kolay hale gelecektir.

Hero Worlddot related to Alan Mantığı ve Boru Hatları ile CQRS İşleyicisi (C#) - Derek Comartin'in Videosu ile Aç...
Hero Affiliate related to Alan Mantığı ve Boru Hatları ile CQRS İşleyicisi (C#) - Derek Comartin'in Videosu ile A�...

Sevdiğiniz Şeyleri Paylaşarak Daha Fazla Kazanın

.NET, C#, Java, Python veya Node.js üzerinde çalışan geliştiriciler için içerik oluşturuyor musunuz? Uzmanlığınızı ek gelire dönüştürün!

Iron Destek Ekibi

Haftanın 5 günü, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara