DDD: Di mana menempatkan penangan event domain?

13

Bisakah Anda memberi tahu saya pendapat Anda bahwa lapisan mana yang tepat untuk menempatkan penangan peristiwa domain di DDD? Misalnya, saya memiliki layanan aplikasi untuk menambahkan kontrak baru dan saya ingin mengirim pemberitahuan email kepada orang yang dapat dihubungi, ketika kontrak telah ditambahkan, begitu juga dengan layanan aplikasi atau layanan domain pengirim email (yang menangani acara ContractAdded) atau sesuatu yang lain?

Toni
sumber

Jawaban:

12

Saya menempatkan pengendali acara domain di lapisan aplikasi.

Peristiwa domain adalah cara untuk memberi tahu lapisan luar (atau dunia luar) bahwa sesuatu terjadi di lapisan domain. Apa yang harus dilakukan dengan acara tergantung pada aplikasi. Aplikasi dapat memberi tahu pengguna tentang perubahan atau memanggil domain lain untuk melakukan sesuatu. Aplikasi bertanggung jawab untuk mengatur operasi domain sebagai reaksi atas tindakan pengguna, permintaan web, atau peristiwa domain.

Eugene Khudoy
sumber
1
+1 untuk lapisan aplikasi. Dalam desain pub-sub, acara domain dapat mengaktifkan logika umum di berbagai tempat / sistem / layanan lintas mikro. Jika salah satu pelanggan adalah aplikasi yang dimodelkan menggunakan DDD, acara tersebut memicu beberapa pemrosesan dalam aplikasi tersebut / BC. Pemrosesan ini mungkin memerlukan demarkasi transaksi, kontrol akses, koordinasi yang biasanya dilakukan pada lapisan aplikasi.
Paulo Merson
2

Buku DDD asli (Evans 2004) menjelaskan lapisan aplikasi sebagai lapisan tipis yang melatih objek domain sebagai respons terhadap tindakan pengguna. Oleh karena itu pengendali kejadian khusus untuk acara domain tidak termasuk dalam lapisan aplikasi.

Mungkin masuk akal untuk menempatkan beberapa dari mereka di lapisan domain, selama Anda tidak melanggar layering dengan menciptakan ketergantungan ke atas.

Jika Anda memiliki lapisan infrastruktur yang berada di bawah lapisan domain, pengendali acara tidak dapat berada di sana karena akan merusak lapisan tersebut.

Jika Anda memiliki lapisan adaptor yang berada di atas lapisan domain, Anda dapat membuat pengendali acara di sana. Lihat arsitektur Hexagonal .

Gudmundur Orn
sumber
2

Saya menempatkan Penangan Kejadian Domain di lapisan Domain sebagai antarmuka domain IDomainEventHandler.

Contoh dari pengendali acara domain adalah kebijakan yang berlangganan acara domain tertentu untuk menginisialisasi transaksi baru (misalnya: untuk memicu perintah domain baru), oleh karena itu masuk akal untuk memilikinya di lapisan Domain karena itu terkait dengan logika bisnis.

Kami dapat memikirkan contoh di mana pesanan dikonfirmasi dan oleh karena itu permintaan faktur harus dibuat. Kami memiliki peristiwa OrderConfirmedEventyang telah terjadi. Kebijakan di domain kami akan bertanggung jawab untuk berlangganan acara ini dan membuat perintah domain RequestInvoiceyang akan ditangani oleh penangan perintah dan ditangani sesuai dengan itu.

Jika kita memiliki event handler ini di lapisan aplikasi, itu berarti lapisan aplikasi, selain mengatur tindakan pengguna, akan menjalankan beberapa logika bisnis, yang tampaknya tidak benar.

Bagaimanapun kita punya

diegosasw
sumber