Event Sourcing'de AggregateRoot yerine Decider deseni tercih edilmeli
Jeremy D. Miller, Event Sourcing yazan .NET geliştiricilerine AggregateRoot yerine Decider desenini öneriyor. Yazıda, Marten ve Wolverine ile saf fonksiyonlara dayanan komut işleyicilerinin neden daha kolay anlaşıldığı, test edildiği ve hata ayıklandığı anlatılıyor.
Kilit noktalar
- Karar mantığını saf bir fonksiyonda tut: mevcut durum ve komuta göre yeni olayları döndürsün, altyapıya dokunmasın.
- Marten ile birlikte Wolverine kullanıldığında altyapı, komut işleyicisi ile domain fonksiyonu arasında aracılık eder.
- Decider fonksiyonları birim testi için doğrudan çağrılabilir, veritabanı veya mock gerekmez.
- Projeksiyonlardan gelen durum nesnelerini uygulama kodunda değiştirme; Marten'in optimizasyonları buna dayanır.
- Evolve (durum oluşturma) mantığını decide mantığından ayırmak, projeksiyon değişikliklerini kolaylaştırır.
- Yeni Event Sourcing işlerinde AggregateRoot yerine Decider'ı varsayılan seçenek olarak düşün.
Yazar, yakında çıkacak bir CQRS ve Event Sourcing kitabının örnek kodlarını incelerken, örneklerin eski AggregateRoot desenine dayandığını fark etmiş. Miller, Event Sourcing kullanan ekiplere domain mantığını Decider deseniyle yazmalarını ve AggregateRoot'tan kaçınmalarını öneriyor. Decider'da bir saf fonksiyon, mevcut durum ve gelen komuta göre hangi olayların ekleneceğine karar verir ve altyapı kodu bu fonksiyonun dışında kalır.
Miller'a göre Decider; komut ile üretilen olaylar arasındaki ilişkiyi açıkça gösterdiği, birim testini kolaylaştırdığı ve sorun giderme sürecini sadeleştirdiği için tercih edilmeli. Marten'in projeksiyonlarının uygulama kodu tarafından değiştirilmemesi varsayımıyla performans iyileştirmeleri yaptığını da ekliyor. Yazı, ayrıntılı kod örnekleri için orijinal makaleye bakılmasını öneriyor.
Gerçek dünyada kullanımı
- Siparişlerin durum geçişlerini olaylarla kaydeden bir e-ticaret sisteminde, sipariş komutlarını saf fonksiyonlarla doğrulamak.
- Marten üzerinde Event Sourcing kullanan bir olay yönetimi veya olay raporlama uygulamasında komut işleyicilerini Wolverine ile bağlamak.
- Eski AggregateRoot tabanlı bir Event Sourcing kodunu kademeli olarak Decider desenine taşımak.
Neden önemli
Event Sourcing kodunu Decider ile yazmak, komutlarla olaylar arasındaki ilişkiyi görünür kılar ve birim testlerini basitleştirir. Mevcut AggregateRoot kullanan projeler için bu yazı, yeni işlerde hangi desenin tercih edilmesi gerektiğini net biçimde gösteriyor.