Perusahaan saya sedang menulis ulang aplikasi web kami dari awal. Ini adalah aplikasi tingkat perusahaan besar dengan domain kompleks di industri keuangan.
Kami menggunakan ORM (kerangka kerja Entity) untuk kegigihan.
Intinya, setengah dari aplikasi kami berpusat di sekitar pengumpulan data mentah dari pengguna, menyimpannya, dan kemudian setengah dari aplikasi lain yang mengandung sebagian besar logika domain aktual kami mengambil data mentah itu untuk membuat gambar domain kami yang sangat berbeda dari yang asli input mentah, dan meneruskannya ke mesin calc, menjalankan calcs, dan memuntahkan hasil, yang kemudian ditampilkan kepada pengguna.
Dalam pendekatan DDD menggunakan lapisan, sepertinya operasi CRUD melewati lapisan domain. tetapi setidaknya dalam kasus kami, ini sepertinya tidak masuk akal.
Misalnya, ketika pengguna pergi ke layar edit untuk mengubah akun investasi, bidang pada layar adalah bidang yang tepat disimpan dalam database, bukan representasi domain yang digunakan nanti untuk perhitungan. Jadi mengapa saya akan memuat representasi domain dari akun investasi ketika layar edit membutuhkan representasi basis data (input mentah)?
Setelah pengguna mengklik "Selesai" pada layar akun investasi, dan POST dilakukan ke controller, controller sekarang memiliki cukup banyak representasi database yang tepat dari akun investasi yang perlu disimpan. Tetapi untuk beberapa alasan, saya seharusnya memuat representasi domain untuk membuat modifikasi alih-alih hanya memetakan model pengontrol langsung ke model database (model kerangka kerja Entity)?
Jadi pada intinya saya memetakan model data ke model domain, supaya bisa dipetakan kembali ke model data untuk bertahan. Bagaimana itu masuk akal?
Jawaban singkat: tidak .
Jawaban yang lebih panjang: pola kelas berat untuk mengembangkan model domain tidak berlaku untuk bagian-bagian solusi Anda yang hanya berupa basis data.
Udi Dahan memiliki pengamatan menarik yang dapat membantu memperjelas ini
Maksud dari model domain, bagaimanapun, adalah untuk memastikan bahwa semua pembaruan pada data mempertahankan invarian bisnis saat ini. Atau, dengan kata lain, model domain bertanggung jawab untuk memastikan bahwa database yang bertindak sebagai sistem catatan sudah benar.
Ketika Anda berhadapan dengan sistem CRUD, Anda biasanya bukan sistem catatan untuk data. Dunia nyata adalah buku catatan, dan basis data Anda hanyalah representasi cache lokal dari dunia nyata.
Misalnya, sebagian besar informasi yang muncul di profil pengguna, seperti alamat email, atau nomor identifikasi yang dikeluarkan pemerintah, memiliki sumber kebenaran yang hidup di luar bisnis Anda - itu adalah administrator surat orang lain yang menetapkan dan mencabut alamat email, bukan aplikasi Anda. Ini adalah pemerintah yang menetapkan SSN, bukan aplikasi Anda.
Jadi Anda biasanya tidak akan melakukan validasi domain pada data yang datang kepada Anda dari dunia luar; Anda mungkin memiliki pemeriksaan untuk memastikan bahwa data terbentuk dengan baik dan disanitasi dengan baik ; tetapi ini bukan data Anda - model domain Anda tidak mendapatkan veto.
Itu tepat untuk kasus di mana database adalah buku catatan .
Ouarzy mengatakannya begini .
Kami menggunakan model domain untuk mengelola data yang berada di dalam domain; data dari luar domain sudah dikelola di tempat lain - kami hanya menyalin salinan.
Greg Young menggunakan sistem gudang sebagai ilustrasi utama solusi di mana buku catatan berada di tempat lain (yaitu: lantai gudang). Implementasi yang ia gambarkan sangat mirip dengan Anda - satu basis data logis untuk menangkap pesan yang diterima dari gudang, dan kemudian basis data logis terpisah yang menyimpan kesimpulan yang diambil dari analisis pesan tersebut.
Mungkin. Saya enggan menandainya sebagai konteks terbatas, karena tidak jelas bagasi apa yang disertakan. Mungkin Anda memiliki dua konteks, mungkin satu konteks dengan perbedaan halus dalam bahasa di mana-mana yang belum Anda ambil.
Kemungkinan uji lakmus: berapa banyak pakar domain yang Anda perlukan dua pakar domain untuk membahas spektrum ini, atau hanya satu yang berbicara tentang komponen dengan cara yang berbeda. Pada dasarnya, Anda mungkin bisa menebak berapa banyak konteks terikat yang Anda miliki dengan menerapkan hukum Conway ke belakang.
Jika Anda mempertimbangkan konteks terikat untuk disejajarkan dengan layanan, mungkin lebih mudah: apakah Anda dapat menggunakan dua fungsi ini secara mandiri? Ya menyarankan dua konteks yang dibatasi; tetapi jika mereka perlu terus disinkronkan, maka mungkin itu hanya satu.
sumber
Di domain Anda, Anda tidak perlu tahu bahwa basis datanya bahkan ada.
Domain Anda adalah tentang aturan bisnis. Hal-hal yang perlu bertahan ketika perusahaan yang membuat basis data Anda gulung tikar. Yaitu, jika Anda ingin perusahaan Anda bertahan. Sangat menyenangkan ketika aturan itu tidak peduli bahwa Anda telah mengubah cara Anda mempertahankan data.
Rincian basis data ada dan perlu ditangani. Mereka harus tinggal di tempat lain. Tempatkan mereka melintasi batas. Kontrol dengan cermat bagaimana Anda berkomunikasi melintasi batas itu atau itu bukan batas.
Paman Bob mengatakan ini tentang apa yang harus dimasukkan data Anda:
Dia juga menjelaskan bagaimana lapisan luar Anda seharusnya menjadi plugin untuk lapisan dalam Anda sehingga lapisan dalam tidak tahu ada lapisan luar.
Ikuti sesuatu seperti itu dan Anda akan memiliki tempat yang bagus untuk mengabaikan basis data di mana Anda dapat khawatir tentang aturan validasi input, aturan yang inputnya harus tetap dipertahankan, aturan untuk menjalankan perhitungan, aturan untuk mengirim hasil tersebut ke output apa pun. Sebenarnya lebih mudah untuk membaca kode semacam ini.
Entah itu atau Anda memutuskan bahwa domain Anda benar-benar hanya untuk memanipulasi database. Dalam hal ini bahasa domain Anda adalah SQL. Jika begitu baik tetapi jangan berharap implementasi Anda dari aturan bisnis untuk bertahan dalam perubahan dalam kegigihan. Anda akhirnya harus menulis ulang sepenuhnya.
sumber
Menerapkan teori DDD:
Ada dua Konteks Terbatas dalam domain itu:
Setiap Bounded Context dapat memiliki desain arsitektur yang berbeda.
Contoh:
Akun Investasi Klien adalah Entitas (mungkin Agregat, tergantung pada domain) dan kegigihan data dilakukan melalui Entitas's Repository (RDB atau jenis DB lainnya seperti Database OO).
Tidak ada pendekatan DDD untuk operasi CRUD. Untuk membuat bidang DB diikat ke data objek, istirahat prinsip-prinsip desain.
sumber