Dalam Desain Berbasis Domain, Lapisan Domain dapat memiliki beberapa layanan (tradisional). Misalnya, untuk domain Pengguna, kami mungkin memiliki:
- UserFactory, yang membangun objek Pengguna dengan cara yang berbeda
- UserRepository, yang bertanggung jawab untuk berinteraksi dengan Layanan Kegigihan di Lapisan Infrastruktur
Apakah Layanan Pengguna dalam Lapisan Domain hanyalah Mediator dan / atau Fasad untuk kedua layanan dan Lapisan Infrastruktur, atau apakah ada yang lebih dari itu?
Jawaban:
Domain services
paling baik dijelaskan oleh apa yang bukan mereka:Entities
bukanAggregate roots
Value objects
Entity
atau satuValue object
Contoh dari a
Domain service
adalahSaga/Process manager
: ia mengoordinasikan proses yang berjalan lama yang melibatkan banyakAggregate roots
, mungkin dari yang berbedaBounded contexts
.Yang sedang berkata, apa itu
Domain service
dan bagaimana itu diterapkan adalah dua hal ortogonal.Beberapa layanan domain seperti
UserRepository
(terdiri dari antarmuka yang ditentukan dalamDomain layer
dan implementasi konkret dalamInfrastructure layer
) dapat diimplementasikan menggunakanFacade
pola desain. Layanan domain lainnya tidak.Tidak ada aturan keras tentang bagaimana mengimplementasikannya, selain aturan penting yang
Domain layer
harus tidak bergantung pada lapisan lain (dan SOLID ).sumber
Saya melihat layanan di DDD sebagai hasil dari Dependency Inversion .
Jika Anda menggunakan dependensi "biasa", maka kode domain Anda akan memanggil database untuk menyimpan atau meminta entitas, atau pabrik, yang membuat entitas, yang terkait dengan database atau layanan eksternal atau semacam kode infrastruktur lainnya.
Tapi bukan itu seharusnya kode domain. Kode domain tidak boleh bergantung pada kode infrastruktur. Karena ketergantungan ini membuat lebih sulit untuk menguji dan, mungkin, menggunakan kembali. Itulah sebabnya Anda membalikkan ketergantungan itu. Anda membuat kode infrastruktur bergantung pada kode domain. Dan untuk melakukan itu, Anda perlu memperkenalkan abstraksi. Abstraksi yang mendefinisikan perilaku apa yang diharapkan oleh kode domain untuk diterapkan oleh infrastruktur.
Dan layanan dalam DDD adalah abstraksi itu. Dalam sebagian besar kasus, untuk kode domain, layanan tersebut harus berupa antarmuka biasa. Dan implementasinya harus dalam kode infrastruktur, yang memiliki ketergantungan pada antarmuka tersebut.
sumber