Saya ingin menerapkan aplikasi pertama saya menggunakan pola CQRS bersama dengan Sumber Acara. Saya bertanya-tanya bagaimana pembuatan akar agregat harus ditangani dengan benar. Katakanlah seseorang mengirim perintah CreateItem. Bagaimana penanganannya? Di mana acara ItemCreated harus disimpan? Sebagai peristiwa pertama dari Item baru? Atau haruskah saya memiliki semacam entitas ItemList yang menggabungkan semua item dan daftar kejadiannya hanya terdiri dari peristiwa ItemCreated?
Udi Dahan menyarankan untuk tidak membuat akar agregat dan selalu menggunakan metode pengambilan. Tetapi bagaimana saya dapat mengambil sesuatu yang baru dan tentu saja tidak memiliki ID yang ditugaskan. Saya memahami ide di balik dan cukup masuk akal untuk berpikir bahwa objek baru adalah objek yang keadaannya terdiri dari nol peristiwa yang dijawab. Tetapi bagaimana saya harus menggunakannya? Haruskah saya memiliki metode yang berbeda dalam Repositori saya suka getNewItem()
atau membuat get(id)
metode saya menerima Optional<ItemId>
sebagai gantinya?
Sunting: Setelah beberapa waktu penggalian, saya menemukan implementasi yang sangat menarik dari pola tersebut menggunakan aktor. Penulis bukannya membuat agregat, mengambilnya dari semacam repositori dengan UUID yang baru dibuat. Kelemahan dari pendekatan ini adalah ia memungkinkan untuk keadaan inkonsistensi sementara. Saya juga bertanya-tanya bagaimana saya bisa menerapkan delete
metode dengan pendekatan seperti itu. Cukup tambahkan acara Dihapus ke daftar acara agregat?
Jawaban:
Gagasan dalam pos Udi, seperti yang saya kumpulkan, adalah bahwa tidak ada barang yang muncul karena kehabisan udara. Selalu ada (hampir) sesuatu, atau lebih khusus lagi, beberapa operasi domain, yang menyebabkan item dibuat. Sama seperti contoh Udi tentang pengguna yang sebenarnya dilahirkan dari pengunjung yang mendaftar ke situs. Pada titik itu dan pada konteks terbatas itu Pengunjung adalah akar agregat, yang diambil oleh alamat IP-nya. Pengunjung ini kemudian membuat "item" baru, seorang pengguna pada saat ini, melalui operasi domain yang disebut Daftar . Hal yang sama berlaku untuk langkah sebelumnya, yang merupakan konteks terikat lainnya: Perujuk adalah AR, yang diambil oleh URL dan yang memiliki operasi domain yang disebut BroughtVisitorWithIp , tempat pengunjung dilahirkan.
Udi menulis dengan sangat baik tentang penghapusan juga: http://www.udidahan.com/2009/09/01/dont-delete-just-dont/ . Gagasan utamanya adalah, Anda tidak pernah menghapus apa pun. Selalu ada operasi domain di belakang, yang ingin kami tangkap. Seperti pesanan dibatalkan, bukan dihapus. Baca itu, ini posting yang sangat bagus.
Poin utama di sini pada kedua akun, melakukan DDD dan terutama Event Sourcing, adalah bahwa Anda tidak boleh melakukan operasi CRUD langsung. Jika Anda menemukan diri Anda dalam situasi di mana Anda benar-benar perlu hanya menyisipkan, memperbarui atau menghapus beberapa data, dan benar-benar tidak ada operasi domain di belakangnya, maka mungkin DDD dan Pengadaan Acara tidak cocok untuk konteks yang dibatasi itu . Anda bebas untuk menggabungkan keduanya seperti yang Anda inginkan selama satu konteks terikat mematuhi satu prinsip. Dengan cara ini konteks terbatas gaya CRUD dapat membuat beberapa baris dalam database, yang menjadi entitas dan akar Agregat dalam konteks terikat lainnya, di mana Anda sekarang dapat mengambil AR dan tidak harus membuatnya.
sumber