DDD ve CRQS kullanırken, komut başına tam olarak bir olay mı olmalı?


17

Ben yapılandırma üzerinde kongre ile bir ddd uygulaması tasarlamak için bir yol arıyorum.

Toplam "İstemci" nin "FillProfile" tanımlı bir komutu olduğunu varsayalım. Mantıksal olarak "ProfileFilled" etkinliğini yükseltir.

Bir komutun bir olaydan daha fazla yükseleceği veya bir komutun bazı mantığa dayalı olarak farklı olayları toplayacağı durumlar var mı? Yoksa bu her zaman 1 - 1 ilişkisidir (1 komutu her zaman hiçbirini veya belirli bir türde tek bir olayı yükseltmez).

Bunu soruyorum çünkü eğer bu bir gerçekse, bir komut her zaman aynı olayı doğuracak, kongre sistemimi bu olgu üzerine kurabilirim. "RaiseEvent" in "EventRaised" ile sonuçlanacağını biliyorum ...


1
komut 2 şeyin gerçekleşmesine neden oluyorsa, her şeyin bir etkinlik oluşturmasını bekleyebilirsiniz. ProfileGenerated, ProfileSaved, Ayrıca herhangi bir olay tekrar olayı yükseltebilecek bir hataya neden olabilir
Ewan

Ayrıca önemsiz sistemler BeforeCommand, AfterCommand vb olayları uygulayabilir
Ewan

Veya komut döngü olabilir, yani FillProfiles () profileFilled, profileFilled ....
Ewan

@Ewan, sadece düzeltmek istiyorum. Bir etki alanı olayı hata oluşturamaz. Yalnızca komutlar olabilir. Etki alanı olayları , komutların reddedilebileceği veya kabul edilebileceği bir şeyin gerçekleşme niyetinin olduğu anlamına gelen bir şeyin olduğu anlamına gelir . Başka bir deyişle, bir etki alanı olayı gönderilmeden önce bir hata oluşturulmalıdır (bu etki alanı olayı elbette hata günlüğü ile ilişkili değilse).
Ludovic C

Yanıtlar:


18

Sorunuzu "CQRS" ile etiketlediğinizden, sanırım burada anlatıldığı gibi "CQRS ve Etkinlik Kaynaklandırma" bağlamındaki etkinlikleri kastediyorsunuz . In Bu eğitimde , olaylar ve komutları arasındaki fark iyice açıklanmıştır:

  • olaylar sisteminizdeki temel "meydana gelebilecek şeyleri" sistem açısından yakalar.

  • komutlar kullanıcının bir işlem olarak gördüğü şeyle kendi bakış açısından tanımlanır

Ve bu genellikle 1: 1 yazışmaları olan birkaç komut ve olaya yol açsa da, bu farklı bakış açısı birden fazla olayı başlatan komutlara veya komut parametrelerine bağlı olarak farklı olaylara yol açabilir. Bir komutun hiç bir olay yaratmadığı durumları bile hayal edebiliyorum, ama bu çok sıra dışı bir durum, çok tipik bir durum değil.

Örneğin, öğretici olaylardan bahseder

  • TabOpened
  • DrinksOrdered
  • FoodOrdered

ve komutlar

  • OpenTab
  • Sipariş Vermek

Burada "OpenTab" komutu "TabOpened" etkinliğine yol açacaktır, ancak PlaceOrder komutu "DrinksOrdered", "FoodOrdered" veya her ikisine birden yol açacaktır.

Aslında, yeni bir sistemi "sıfırdan" tasarlıyorsanız, komutlar ve olaylar arasında 1: 1 yazışma ile tasarlamayı deneyebilir ve sistem büyüdükçe bunun ne kadar iyi ölçeklendiğine bakabilirsiniz. Karma bir yaklaşımı bile deneyebilirsiniz: 1: 1 yazışması olan olayların ve komutların listesi, bazı ek, kombine komutlarla birlikte. Bunun, tasarladığınız sistem için sizi ne kadar ileri götürdüğünü deneyin.


10

Genellikle bir komut bir olaya yol açar. Ancak bazı durumlarda birden fazla da olabilir, bu sizin uygulamanıza bağlıdır.

Komutunuz diğer komutları çağırır ve her biri kendi olaylarını başlatır. Veya komutunuz kendi başına farklı görevler yapar ve birden fazla olay yayınlar. Örneğin:

RegisterUserCommand

  • User.create (e-posta, şifre) → UserCreatedEvent
  • User.updateProfile (firstName, lastName, location) → UserProfileUpdatedEvent
  • User.joinDefaultGroup () → UserJoinedGroupEvent

Daha sonra sahip olmaya karar verirseniz ne olur UserWasAddedToCrm? Akışınızın tamamı yeniden yazılsın mı?
mcintyre321

@ mcintyre321 arama koreograflanmış vs orkestra olayları
Benten

TBH bu soru biraz karışık - DDD / CQRS hakkında konuşuyor, aslında bir Olay Kaynak Sorusu veya Olay Odaklı Mimari sorusu olup olmadığına karar vermesi gerektiği gibi görünüyor.
mcintyre321

10

Bir komut birden fazla olayı yükseltebilir. Basitçe bir gerçeğin mantıksal sonucudur:Composite command var.

Her biri bir olay yaratan iki komutunuz olduğunu varsayalım. Ardından, bu ikisinin bileşik bir komutunu oluşturursunuz. Kompozit komutu kullanan birinden bakıldığında, komut iki olay oluşturmuş gibi görünüyor.

Bu nedenle, birden fazla (hatta hiç) olayı yükseltmek için tek bir komut almanızı engelleyen hiçbir şey yoktur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.