Masalah yang terus saya hadapi adalah bagaimana menangani nilai-nilai yang dikomputasi didorong oleh logika domain sementara masih bekerja secara efisien terhadap penyimpanan data.
Contoh:
Saya mengembalikan daftar Produk dari repositori saya melalui layanan. Daftar ini dibatasi oleh informasi pagination dari permintaan DTO yang dikirim oleh klien. Selain itu, DTO menetapkan parameter sortir (enum yang ramah-klien).
Dalam skenario sederhana, semuanya berfungsi dengan baik: layanan mengirimkan paging dan menyortir ekspresi ke repo dan repo mengeluarkan kueri yang efisien ke DB.
Namun, semua itu rusak ketika saya harus mengurutkan nilai yang dihasilkan dalam memori dari model domain saya. Misalnya kelas Produk memiliki metode IsExpired () yang mengembalikan bool berdasarkan logika bisnis. Sekarang saya tidak bisa mengurutkan dan halaman di tingkat repo - semua akan dilakukan dalam memori (tidak efisien) dan layanan saya harus tahu seluk-beluk kapan mengeluarkan params ini ke repo dan kapan melakukan sorting / paging diri.
Satu-satunya pola yang tampaknya masuk akal bagi saya adalah untuk menyimpan keadaan entitas di db (membuat IsExpired () bidang yang hanya dibaca dan memperbaruinya melalui logika domain sebelum menyimpan). Jika saya memisahkan logika ini menjadi repositori "baca model / dto" dan "pelaporan" yang terpisah, saya membuat model saya lebih anemia daripada yang saya inginkan.
BTW, setiap contoh saya telah melihat di luar sana untuk perhitungan seperti ini benar-benar bersandar pada pemrosesan dalam memori dan mengabaikan fakta bahwa itu jauh lebih efisien dalam jangka panjang. Mungkin saya terlalu dini mengoptimalkan, tapi itu tidak cocok dengan saya.
Saya ingin mendengar bagaimana orang lain berurusan dengan ini karena saya yakin itu biasa terjadi pada hampir proyek yang melibatkan DDD.
sumber
Saya kira saya akan mempertanyakan logika bisnis apa yang menentukan apakah Expired benar atau tidak. Bisakah logika ini dilakukan oleh permintaan sebagai model data berdiri? Jika demikian, dapatkah Anda membuat repositori Anda cukup pintar untuk menggunakan logika "isExpired" ketika Anda meminta Produk dengan cara tertentu? Jika tidak, mungkin Anda perlu menguji kembali model data Anda.
DDD tidak berarti bahwa repositori Anda harus bodoh - itu hanya berarti domain Anda perlu tahu cara berbicara dengan repositori Anda.
sumber