Saya telah bekerja dalam aplikasi yang relatif kompleks dengan 10 tabel database (Agregat, Entitas / Nilai Objek) dan menerapkan DDD. Pada titik ini pada dasarnya tampak DDD-Lite yang berarti bahwa ada Layanan Aplikasi / Domain, Model Domain (Entitas, Nilai Objek), dan Repositori.
Saya mengambil buku Menerapkan DDD dan hal pertama yang ia sebutkan adalah DDD-Lite dan Konteks Terbatas dan Peristiwa Domain hilang sebagai kesalahan pertama yang biasa terjadi ketika memulai DDD.
Saat ini saya sudah mencoba mengatur Model Domain oleh hubungan Agregat, dan menggunakan ruang nama untuk menunjukkannya.
Saya gagal melihat manfaat / kejatuhan terkait pemisahan proyek Model Domain ke dalam konteks Terikat terpisah (belum). Mungkin akan menjadi jelas nanti tapi saya ingin umpan balik kehidupan nyata pada Bounded Contexts (dan mungkin sub domain dll jika mereka mengikat ke dalamnya).
Jawaban:
Pertimbangkan perusahaan yang memiliki beberapa departemen berbeda:
Bisakah Anda membuat model pengguna yang secara ekspresif dapat mewakili semua area bisnis itu? Pikirkan seperti apa entitas Pengguna di masing-masing. Mungkin dibagi menjadi tiga entitas yang berbeda:
Upaya untuk membuat instantiate pengguna dalam setiap konteks sangat berbeda. Mungkin kira-kira seperti ini:
maafkan contoh, sulit untuk menggambarkan secara akurat tanpa model domain yang tepat untuk referensi
Jika Anda menggunakan implementasi naif dan menggunakan entitas pengguna tunggal, itu akan berakhir menjadi model data anemia penuh pengambil dan penyetel, karena Anda tidak bisa sepenuhnya mewakili pengguna di semua tempat.
Ada batasan yang jelas dalam bisnis ini, jadi sangat berguna untuk memodelkannya seperti itu. Seorang pengguna yang masuk versus pengguna dalam sistem penggajian versus pengguna yang bermain game semuanya sangat berbeda, bahkan jika mereka adalah bagian dari sistem besar yang sama.
Berpikir dengan cara lain - Anda sekarang dapat membuat kode manajemen pengembang Anda menjadi sangat ringan dan independen dari sisa sistem Anda. Itu dapat menggunakan tipe yang lebih akurat dengan sedikit bagasi yang perlu dikhawatirkan. Ini adalah langkah untuk membangun subsistem yang lebih kecil yang pada akhirnya dapat diekstraksi ke dalam aplikasinya sendiri.
sumber
Employee
bukan aUser
, ia memiliki aUser
. IniUser
hanyalah sebuah entitas di mana seseorang dapat login dan mengakses satu atau lebih aplikasi di dalam organisasi. DanEmployee
tidak selalu memilikiUser
. Selain itu, Anda biasanya tidak mendapatkan aplikasi sederhana untuk berbagai departemen; biasanya, setiap departemen memiliki aplikasi sendiri, masing-masing berisi model domainnya sendiri. Jadi, bagi saya jawaban ini tidak membantu mengklarifikasi kebutuhan untuk memiliki konteks terikat terpisah dalam basis kode yang sama.Saya bisa memberi Anda contoh lain. Anggap Anda memiliki beberapa sistem e-niaga. Anda akan memiliki produk di sana, namun produk akan menjadi bagian dari setidaknya dua domain berbeda:
Jika Anda memiliki satu konteks terbatas untuk kedua domain, solusi Anda dapat dengan cepat menjadi bola lumpur besar karena Anda akan mulai referensi silang itu. Pada akhirnya Anda tidak akan memiliki dua domain lagi. Inventaris produk Anda akan dimanjakan dengan referensi katalog produk dan sebaliknya. Karena ini, Anda tidak akan dapat mengubah satu domain tanpa menyentuh yang lain meskipun Anda sepenuhnya menyadari ini tidak diperlukan. Model Anda menjadi tergantung satu sama lain dan sangat erat, dan tergantung dengan cara yang buruk - tergantung pada implementasi.
Namun, jika Anda memiliki dua konteks terikat, semua perubahan yang Anda lakukan dalam satu domain tidak akan memengaruhi yang lain segera setelah Anda menjaga saluran komunikasi tetap jelas. Ini berarti Anda harus memiliki duplikasi data tetapi ini adalah biaya paling murah untuk membayar aplikasi berbasis komponen yang salah. Domain Anda dapat berbicara satu sama lain menggunakan peristiwa domain. Bahkan jika Anda tidak berencana untuk memiliki aplikasi berbasis SOA di awal, Anda akan dapat meningkatkan ke tingkat itu ketika Anda perlu dengan usaha yang relatif rendah karena Anda hanya mengubah transportasi untuk acara domain Anda, meninggalkan ide di baliknya tetap utuh.
Pembaruan: Ada siaran keterampilan yang bagus tentang SkillsMatter, dari Eric Evans. Dia memberikan analogi cerita lama, ketika beberapa orang buta menggambarkan seekor gajah dari sudut pandang mereka. Karena setiap manusia hanya dapat menyentuh sebagian dari gajah, mereka menggambarkannya sebagai "pohon", "dinding", "ular", "tali". Dan masing-masing pria itu benar dalam konteksnya. Konteks terikat adalah tempat tinggal bahasa di mana-mana. Di luar konteks, istilah-istilah ini mungkin memiliki makna yang sangat berbeda tetapi di dalam konteksnya, bahasanya sama di berbagai domain. Greg Young sangat menyarankan untuk mulai membaca buku biru dari bab 11, karena konsep paling penting dan mendasar dijelaskan di sana. Fokus pada pola taktis di awal buku membuat pendekatan "DDD-light" ini sangat umum,
sumber
Product
kelas - kelas ini keduanya secara hipotetis berbagi ID yang sama (mis. Kedua tabel BC terpisah memiliki kunci asing ke tabel dengan ID Produk tunggal)? Mungkin saat berkomunikasi dengan Acara Domain mereka dapat menggunakan ID itu?