Anda mungkin ingin menampilkan tingkat persediaan pada halaman web, atau Anda mungkin ingin menampilkan nomor edisi persediaan dalam stok (bayangkan inventaris Anda adalah buku, majalah, dll). Informasi ini berasal dari domain Inventaris.
Hal utama yang perlu diperhatikan pada saat ini adalah bahwa Anda berbicara tentang tampilan, yang mengatakan bahwa menggunakan data basi dapat diterima.
Karena itu, Anda tidak perlu berinteraksi dengan agregat (yang bertanggung jawab untuk mencegah perubahan dari pelanggaran invarian bisnis), tetapi dengan representasi salinan terbaru dari status agregat.
Jadi apa yang biasanya saya harapkan adalah menjalankan kueri terhadap Katalog Produk, dan satu lagi menjalankan terhadap Inventaris, dan sesuatu untuk menyusun keduanya menjadi DTO yang Anda butuhkan untuk mendukung tampilan.
Muat domain Produk dan agregat domain Inventaris?
Jadi itu dekat . Kami tidak perlu memuat agregat, karena kami tidak akan mengubah apa pun. Tetapi kita membutuhkan negara mereka; jadi kita bisa memuatnya. Yang mengatakan, saya biasanya berharap dua domain akan berjalan dalam proses yang berbeda. Karena itu, kami akan memanggil keduanya, bukan memuat keduanya.
Apakah Anda memegang beberapa properti pada entitas domain Produk Anda untuk nomor dalam stok, dan edisi dalam stok, dan kemudian menggunakan Acara Domain untuk memperbarui ini ketika entitas Inventaris diperbarui?
"Jangan menyeberangi sungai. Itu akan buruk."
Menggunakan peristiwa untuk mengoordinasikan informasi di seluruh konteks domain: ide bagus . Mendorong konsep yang termasuk dalam satu domain ke domain lain: kebalikan dari ide bagus, kecuali lebih dari itu.
Anda ingin menjaga domain tetap bersih. The aplikasi yang berinteraksi dengan domain, itu tidak begitu penting. Jadi misalnya, masuk akal untuk aplikasi Inventaris untuk memanggil layanan di aplikasi produk untuk menanyakan beberapa konsep spesifik produk untuk ditambahkan ke tampilan. Atau sebaliknya.
Saya tidak tahu alasan mengapa satu aplikasi perlu dibatasi untuk satu domain. Selama ada satu sumber kebenaran, Anda dapat mendistribusikan transaksi sesuka Anda.
Tapi hanya untuk memikirkan ini, dalam contoh di atas kita akan berakhir dengan berpotensi 2 tabel DB untuk katalog produk dan inventaris produk. Sekarang, apakah kita menggunakan pengidentifikasi yang sama karena ini adalah produk yang sama.
Itu akan menjadi cara yang mudah. Dalam istilah yang lebih besar, Anda menggunakan pengidentifikasi yang sama karena entitas dunia nyata adalah sama; dua konteks terikat yang berbeda memodelkan entitas itu secara berbeda, tetapi model itu bukanlah entitas dunia nyata.
Ketika itu tidak berhasil, maka Anda akan memerlukan beberapa permintaan untuk menjembatani kesenjangan. Saya pikir variasi paling umum dari ini adalah bahwa entitas yang lebih baru mempertahankan id dari entitas yang lebih tua. Anda akan melihat ini dalam satu BC juga: pelamar, ketika disetujui, menjadi klien. Ini adalah agregat yang berbeda (keadaan yang terkait dengan klien tunduk pada invarian yang berbeda dari pelamar); jadi jika lapisan kegigihan Anda menggunakan aliran acara, aliran untuk agregat baru akan membutuhkan pengidentifikasi yang berbeda. Jadi akan ada sedikit negara di suatu tempat yang mengatakan "pelamar ini menjadi klien ini".
Atau, dapatkah kita menggunakan 1 tabel dan 1 baris tabel untuk data dan hanya memetakan data yang relevan ke properti agregat?
YIKES! Tidak, jangan lakukan itu. Anda menambahkan pertentangan transaksi tanpa alasan bisnis untuk melakukannya.
Saya pikir pertanyaan Anda benar-benar membutuhkan 2 set pilihan orthogonal -
Apakah Anda memuat dua objek dan menyajikan datanya bersama-sama atau Anda memuat 1 objek yang berisi semua yang Anda inginkan?
Apakah Anda menggunakan agregat untuk menampilkan barang, atau yang lainnya?
Jika Anda percaya pada pendekatan CQRS, ternyata agregat mungkin bukan taruhan terbaik untuk dibaca. Setiap kali Anda memuat agregat, apakah akan menampilkan data atau memodifikasinya, Anda menambahkan konkurensi dan pertikaian ke sistem Anda. Juga, agregat berpotensi lebih besar dan lebih lambat untuk dimuat daripada jika Anda menggunakan model baca ad-hoc yang dirancang khusus untuk tampilan.
Solusi a) dari Q Anda tampaknya mengalami banyak jebakan ini. Opsi b) dapat valid, tetapi saya akan menggunakannya hanya jika data dari
InventoryManagement
BC diperlukan untuk menegakkan invarian ketika memutasikanProduct
agregat. Lebih baik jika agregat berisi semua data yang diperlukan untuk memeriksa aturan bisnisnya setelah modifikasi, tetapi di sisi baca mereka dapat duduk di mana saja.Mengenai data, rekomendasi umum adalah memberikan Bounded Contexts database mereka sendiri (untuk alasan penerapan dan alasan SoC). Anda mungkin harus menggunakan pengidentifikasi yang sama jika Anda ingin mencocokkan produk di antara kedua BC.
Tentang interaksi lintas-BC, Anda mungkin juga ingin melihat /programming/16713041/communicating-between-two-bounded-contexts-in-ddd
sumber
DDD dimaksudkan untuk aplikasi yang logika bisnisnya kompleks. "cetak sesuatu" bukanlah logika bisnis yang kompleks. Ini sebenarnya bukan logika bisnis sama sekali.
Jika, logika bisnis dalam satu konteks memerlukan beberapa informasi untuk menangani beberapa kasus penggunaan, maka informasi tersebut merupakan bagian dari konteks itu. Jadi ide bahwa konteks terbatas mungkin memerlukan informasi yang tersedia dalam konteks terbatas berbeda tidak masuk akal, karena konteks terbatas memiliki semua informasi yang dibutuhkan.
sumber
Dari sudut pandang saya ada definisi yang berbeda dari "Produk" - setiap konteks-batas memiliki definisi sendiri tentang "produk" -domain:
Selain itu, saya akan menambahkan konteks Shop-Bounding-Context tambahan dengan definisi produknya sendiri (kombinasi yang relevan dari domain produk dari konteks Bounding-Contexts lainnya).
Produk Toko akan memiliki "gambar dan teks deskripsi" dari konten dan ketersediaan dari "Inventaris" tetapi bukan "penjual produk" dari inventaris.
Konteks Shop-Bounding-tambahan ini tergantung pada Konten, Inventarisasi, Harga Bounding-Context
sumber