Mari kita bayangkan saya memiliki Grup dan Pengguna dan ketika pengguna ingin bergabung dengan grup, saya memanggil metode groupsService.AddUserToGroup (grup, pengguna). Dalam DDD saya harus melakukan group.JoinUser (pengguna), yang terlihat cukup bagus.
Tetapi DDD juga mendorong Anda untuk menggunakan layanan (stateless) untuk melakukan tugas, jika tugas yang dihadapi terlalu rumit atau tidak akan cocok dengan model entitas. Tidak masalah memiliki layanan di lapisan domain. Tetapi layanan di lapisan domain hanya boleh menyertakan logika bisnis. Tugas eksternal dan logika aplikasi (seperti mengirim email) di sisi lain, harus menggunakan layanan domain di lapisan aplikasi, di mana Anda dapat memiliki layanan (aplikasi-) terpisah yang membungkusnya misalnya.
Masalahnya muncul jika saya ada beberapa aturan validasi untuk menambahkan pengguna ...
Aturan validasi memang milik model domain! Mereka harus dienkapsulasi di dalam objek domain (entitas dll).
... atau beberapa tugas eksternal harus dimulai ketika pengguna ditambahkan ke grup. Memiliki tugas-tugas ini akan menyebabkan entitas memiliki dependensi eksternal.
Meskipun saya tidak tahu apa jenis tugas eksternal yang Anda bicarakan, saya menganggap itu sesuatu seperti mengirim email dll. Tapi ini bukan bagian dari model domain Anda. Itu harus hidup di lapisan aplikasi dan di-hanlded di sana. Anda dapat memiliki layanan di lapisan aplikasi Anda yang beroperasi pada layanan domain dan entitas untuk melakukan tugas-tugas tersebut.
Tetapi kenyataan bahwa Entitas bergantung pada beberapa layanan / kelas eksternal tampaknya tidak begitu baik dan "alami" bagi saya.
Itu tidak wajar dan tidak seharusnya terjadi. Entitas tidak boleh tahu tentang hal-hal yang bukan tanggung jawabnya. Layanan harus digunakan untuk mengatur interaksi entitas.
Apa cara yang tepat untuk menangani ini dalam DDD?
Dalam kasus Anda, hubungan mungkin harus dua arah. Apakah pengguna bergabung dengan grup atau grup mengambil pengguna tergantung pada domain Anda. Apakah pengguna bergabung dengan grup? Atau apakah pengguna ditambahkan ke grup? Bagaimana cara kerjanya di domain Anda?
Bagaimanapun, Anda memiliki hubungan dua arah dan dengan demikian dapat menentukan jumlah grup yang sudah dimiliki pengguna di dalam agregat pengguna. Apakah Anda meneruskan pengguna ke grup atau grup ke pengguna secara teknis sepele setelah Anda menentukan kelas yang bertanggung jawab.
Validasi kemudian harus dilakukan oleh entitas. Semuanya dipanggil dari layanan lapisan aplikasi yang juga dapat melakukan hal-hal teknis, seperti mengirim email dll.
Namun, jika logika validasi benar-benar rumit, layanan domain mungkin merupakan solusi yang lebih baik. Dalam hal itu, enkapsulasi aturan bisnis di sana dan kemudian panggil dari lapisan aplikasi Anda.
Cara saya mendekati masalah validasi adalah dengan cara ini: Membuat Layanan Domain bernama
MembershipService
:Entitas Grup perlu disuntik
IMemberShipService
. Ini dapat dilakukan di tingkat kelas atau tingkat metode. Mari kita asumsikan kita melakukannya di level metode.Layanan Aplikasi:
GroupService
dapat disuntikkan denganIMemberShipService
menggunakan injeksi Konstruktor, yang kemudian dapat diteruskan keJoinUser
metodeGroup
kelas.sumber