Seperti yang saya pahami, poin utama adalah untuk memisahkan Logika Domain (Logika Bisnis) dari Infrastruktur (DB, Sistem File, dll.).
Ini adalah dasar dari kesalahpahaman: tujuan DDD bukan untuk memisahkan hal-hal di sepanjang garis keras seperti "ini di server SQL, jadi tidak boleh BL", tujuan DDD adalah untuk memisahkan domain dan menciptakan hambatan antara mereka yang memungkinkan internal suatu domain untuk sepenuhnya terpisah dari internal domain lain, dan untuk mendefinisikan eksternal yang dibagi di antara mereka.
Jangan menganggap "berada di SQL" sebagai penghalang BL / DL — bukan itu masalahnya. Sebaliknya, pikirkan "ini adalah akhir dari domain internal" sebagai penghalang.
Setiap domain harus memiliki API yang menghadap eksternal yang memungkinkannya untuk bekerja dengan semua domain lain : dalam hal lapisan penyimpanan data , itu harus memiliki tindakan baca / tulis (CRUD) untuk objek data yang disimpannya. Ini berarti SQL itu sendiri tidak benar-benar penghalang, VIEW
dan PROCEDURE
komponennya. Anda tidak boleh membaca langsung dari tabel: itu adalah detail implementasi yang dikatakan DDD kepada kita bahwa, sebagai konsumen eksternal, kita tidak perlu khawatir.
Pertimbangkan contoh Anda:
Yang saya bertanya-tanya adalah, apa yang terjadi ketika saya memiliki pertanyaan yang sangat kompleks seperti Permintaan Perhitungan Sumber Daya Material? Dalam kueri semacam itu Anda bekerja dengan operasi set berat, jenis hal yang dirancang untuk SQL.
Inilah yang seharusnya ada di SQL, dan itu bukan pelanggaran DDD. Untuk itulah kami membuat DDD . Dengan perhitungan dalam SQL, itu menjadi bagian dari BL / DL. Apa yang akan Anda lakukan adalah menggunakan tampilan terpisah / prosedur tersimpan / apa pun yang Anda miliki, dan menjaga logika bisnis terpisah dari lapisan data, karena itu adalah API eksternal Anda. Bahkan, lapisan data Anda harus menjadi DDD Domain Layer lain, di mana lapisan data Anda memiliki abstraksi sendiri untuk bekerja dengan lapisan domain lainnya.
Melakukan perhitungan ini dalam infrastruktur tidak dapat terjadi juga, karena pola DDD memungkinkan untuk perubahan infrastruktur tanpa mengubah Layer Domain dan mengetahui bahwa MongoDB tidak memiliki kemampuan yang sama seperti misalnya SQL Server, yang tidak dapat terjadi.
Itu kesalahpahaman lain: ia mengatakan detail implementasi secara internal dapat berubah tanpa mengubah lapisan domain lainnya . Tidak dikatakan Anda hanya bisa mengganti seluruh infrastruktur.
Sekali lagi, perlu diingat, DDD adalah tentang menyembunyikan internal dengan API eksternal yang terdefinisi dengan baik. Di mana letak API itu adalah pertanyaan yang sama sekali berbeda, dan DDD tidak mendefinisikannya. Itu hanya mendefinisikan bahwa API ini ada, dan tidak boleh berubah .
DDD tidak diatur untuk memungkinkan Anda mengganti ad-hoc MSSQL dengan MongoDB — keduanya adalah komponen infrastruktur yang sama sekali berbeda.
Sebagai gantinya, mari kita gunakan analogi untuk apa yang didefinisikan oleh DDD: gas vs mobil listrik. Kedua kendaraan memiliki dua metode yang sama sekali berbeda untuk membuat propulsi, tetapi mereka memiliki API yang sama: on / off, throttle / rem, dan roda untuk mendorong kendaraan. DDD mengatakan bahwa kita harus dapat mengganti mesin (gas atau listrik) di mobil kita. Itu tidak mengatakan kita dapat mengganti mobil dengan sepeda motor, dan itulah MSSQL → MongoDB.