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.