Saat menggunakan DDD dan CRQS, haruskah persis satu peristiwa per perintah?

17

Saya mencari cara untuk merancang aplikasi ddd dengan konvensi konfigurasi.

Katakanlah agregat "Klien" memiliki perintah yang didefinisikan "FillProfile". Secara logis akan memunculkan acara "ProfileFilled".

Adakah kasus ketika suatu perintah akan meningkatkan lebih dari satu peristiwa, atau di mana suatu perintah akan memunculkan peristiwa yang berbeda berdasarkan pada beberapa logika? Atau apakah ini selalu hubungan 1 - 1 (1 perintah akan selalu menimbulkan tidak ada, atau satu peristiwa dari jenis tertentu).

Saya menanyakan ini karena jika ini adalah fakta, bahwa suatu perintah akan selalu memunculkan peristiwa yang sama, saya dapat membangun sistem konvensi saya berdasarkan fakta itu. Saya tahu bahwa "RaiseEvent" akan menghasilkan "EventRaised" ...

Ludovic C
sumber
1
jika perintah menyebabkan 2 hal terjadi, Anda mungkin mengharapkan setiap hal untuk meningkatkan suatu peristiwa. ProfileGenerated, ProfileSaved, Juga setiap peristiwa dapat menyebabkan kesalahan yang sekali lagi dapat meningkatkan suatu peristiwa
Ewan
Juga sepele mungkin sistem menerapkan BeforeCommand, AfterCommand dll peristiwa
Ewan
Atau perintah itu mungkin berulang yaitu FillProfiles () profileFilled, profileFilled ....
Ewan
@ Ewan, hanya ingin mengoreksi Anda. Peristiwa domain tidak dapat menghasilkan kesalahan. Hanya perintah yang bisa. Peristiwa domain berarti sesuatu terjadi , karena perintah berarti ada niat untuk membuat sesuatu terjadi, yang dapat ditolak atau diterima. Dengan kata lain, kesalahan harus dimunculkan sebelum peristiwa domain dikirim (kecuali jika peristiwa domain itu terkait dengan kesalahan log tentu saja).
Ludovic C

Jawaban:

18

Karena Anda menandai pertanyaan Anda dengan "CQRS", saya kira maksud Anda adalah peristiwa dalam konteks "CQRS & Event Sourcing", seperti dijelaskan di sini . Dalam tutorial ini , perbedaan antara peristiwa dan perintah dijelaskan dengan baik:

  • peristiwa menangkap "hal-hal yang dapat terjadi" yang mendasar dalam sistem Anda, dari sudut pandang sistem.

  • perintah didefinisikan oleh apa yang pengguna anggap sebagai operasi, dari sudut pandangnya

Dan meskipun ini sering mengarah ke beberapa perintah dan acara dengan korespondensi 1: 1, sudut pandang yang berbeda ini dapat mengarah pada perintah yang memecat lebih dari satu peristiwa, atau peristiwa yang berbeda tergantung pada parameter perintah. Saya bahkan bisa membayangkan kasus-kasus di mana perintah sama sekali tidak membangkitkan suatu peristiwa, tetapi itu akan menjadi kasus yang sangat luar biasa, bukan yang sangat khas.

Misalnya, tutorial menyebutkan acara

  • Dibuka Tab
  • Minuman yang dipesan
  • Makanan yang dipesan

dan perintah

  • OpenTab
  • Tempat pesanan

Di sini, perintah "OpenTab" akan mengarah ke acara "TabOpened", tetapi perintah PlaceOrder akan mengarah ke acara "DrinksOrdered", "FoodOrdered", atau keduanya.

Bahkan, jika Anda mendesain sistem baru "dari awal", Anda dapat mencoba mendesainnya dengan korespondensi 1: 1 antara perintah dan acara dan lihat seberapa baik skala itu ketika sistem menjadi lebih besar. Anda bahkan dapat mencoba pendekatan hybrid: daftar acara dan perintah dengan korespondensi 1: 1, bersama dengan beberapa perintah tambahan, gabungan. Coba saja seberapa jauh itu menuntun Anda untuk sistem tertentu yang Anda rancang.

Doc Brown
sumber
10

Biasanya satu perintah akan mengarah ke satu acara. Tetapi dalam beberapa kasus bisa juga lebih dari satu, itu tergantung pada implementasi Anda.

Entah perintah Anda memanggil perintah lain dan masing-masing dari mereka menjalankan acara sendiri. Atau perintah Anda melakukan tugas berbeda sendiri dan mengeluarkan beberapa peristiwa. Sebagai contoh:

RegistrasiUserCommand

  • User.create (email, kata sandi) → UserCreatedEvent
  • User.updateProfile (firstName, lastName, location) → UserProfileUpdatedEvent
  • User.joinDefaultGroup () → UserJoinedGroupEvent
synthomat
sumber
Apa yang terjadi jika Anda kemudian memutuskan untuk memilikinya UserWasAddedToCrm? Tulis ulang seluruh aliran Anda?
mcintyre321
@ mcintyre321 cari koreografi vs acara yang diatur
Benten
10

Satu perintah dapat memunculkan banyak acara. Ini hanyalah kesimpulan logis dari satu fakta: Composite commandada.

Katakanlah Anda memiliki dua perintah, masing-masing membangkitkan suatu peristiwa. Kemudian, Anda membuat perintah gabungan dari keduanya. Dari pandangan seseorang yang menggunakan perintah gabungan, tampaknya seolah-olah perintah itu membangkitkan dua peristiwa.

Jadi tidak ada yang menghentikan Anda dari perintah tunggal meningkatkan beberapa (atau bahkan tidak ada) acara.

Euforia
sumber