Jadi setelah membaca "Menerapkan Desain Berbasis Domain oleh Vaughn Vernon" Saya telah memutuskan untuk memperbaiki kode saya untuk kegunaan yang lebih baik dengan mengisolasi apa yang saya yakini sebagai konsep domain inti ke dalam modul terpisah.
Setiap modul berisi set sendiri lapisan arsitektur yang berbeda yang mencakup Domain, Infrastruktur, dan lapisan Aplikasi / Presentasi (sesuai rekomendasi Vaughn, saya telah memutuskan untuk lebih jauh memisahkan tanggung jawab lapisan Aplikasi dari rute, pengontrol MVC + templat yang ada di Lapisan Presentasi).
Saya telah memutuskan untuk menempatkan masing-masing lapisan ini dalam paket mereka sendiri; dan setiap paket mereferensikan layer di bawahnya sebagai dependensi. yaitu: Lapisan Presentasi tergantung pada Lapisan Aplikasi, Aplikasi tergantung pada Infrastruktur, dll. Karena Repositori adalah bagian dari Domain, setiap Antarmuka Repositori ada di dalam lapisan / paket Domain dengan implementasi menjadi tanggung jawab lapisan / paket Infrastruktur (Doktrin , dll).
Saya berharap bahwa dengan merestrukturisasi kode saya dengan cara ini saya akan dapat menukar lapisan Aplikasi dan menggunakan kembali Domain saya di beberapa Aplikasi Web.
Kode akhirnya terlihat seperti mulai terbentuk lagi namun yang masih membingungkan saya adalah perbedaan antara Aplikasi, Infrastruktur, dan Layanan Domain ini.
Salah satu contoh umum Layanan Domain adalah sesuatu yang akan Anda gunakan untuk kata sandi hash. Ini masuk akal bagi saya dari perspektif SRP karena entitas Pengguna seharusnya tidak mementingkan dirinya sendiri dengan banyak algoritma hashing yang berbeda yang dapat digunakan untuk menyimpan kredensial pengguna.
Maka dengan itu dalam pikiran saya memperlakukan layanan Domain baru ini dengan cara yang sama seperti Repositori saya; dengan mendefinisikan antarmuka di Domain dan membiarkan implementasinya hingga ke lapisan Infrastruktur. Namun, sekarang saya bertanya-tanya tentang apa yang harus dilakukan dengan Layanan Aplikasi.
Seperti sekarang, setiap Entitas memiliki Layanan Aplikasi sendiri, yaitu Entitas Pengguna memiliki Layanan Pengguna dalam Lapisan Aplikasi. UserService dalam hal ini bertanggung jawab untuk mem-parsing tipe data primitif dan menangani kasus penggunaan umum "UserService :: CreateUser (nama string, email string, dll): Pengguna.
Yang membuat saya khawatir adalah kenyataan bahwa saya perlu mengimplementasikan kembali logika ini di beberapa aplikasi jika saya memutuskan untuk menukar layer Aplikasi. Jadi saya kira ini mengarahkan saya ke beberapa pertanyaan saya berikutnya:
Apakah Layanan Domain hanyalah Antarmuka yang ada untuk memberikan lapisan abstraksi antara Lapisan Infrastruktur dan Model Anda? yaitu: Repositori + Layanan Hashing, dll.
Saya sebutkan memiliki Layanan Aplikasi yang terlihat seperti ini:
Akses / Aplikasi / Layanan / UserService :: CreateUser (nama string, email string, dll): Pengguna
Tanda tangan metode menerima argumen tipe data primitif dan mengembalikan Entitas Pengguna baru (bukan DTO!).
Apakah ini termasuk dalam lapisan Infrastruktur sebagai implementasi dari beberapa antarmuka yang didefinisikan dalam lapisan Domain atau apakah Lapisan Aplikasi sebenarnya lebih sesuai karena argumen tipe data primitif, dll ?
contoh:
Access/Domain/Services/UserServiceInterface
dan
Access/Infrastructure/Services/UserService implements UserServiceInterface
Bagaimana seharusnya modul terpisah menangani hubungan searah. Haruskah lapisan aplikasi modul A modul referensi B (seperti yang dilakukannya sekarang) atau implementasi infrastruktur (melalui antarmuka terpisah)?
Apakah Layanan Lapisan Aplikasi memerlukan Antarmuka Terpisah? Jika jawabannya ya maka di mana mereka seharusnya berada?