(Jika Anda tidak ingin membaca, ada ringkasan di bagian bawah :-)
Saya juga telah berjuang dengan definisi layanan aplikasi yang tepat. Meskipun jawaban Vijay sangat membantu proses berpikir saya sebulan yang lalu, saya menjadi tidak setuju dengan sebagian dari itu.
Sumber daya lainnya
Ada sangat sedikit informasi tentang layanan aplikasi. Subjek seperti akar agregat, repositori, dan layanan domain dibahas secara luas, tetapi layanan aplikasi hanya disebutkan secara singkat atau ditinggalkan sama sekali.
Artikel MSDN Magazine Pengantar Untuk Desain Berbasis Domain menjelaskan layanan aplikasi sebagai cara untuk mengubah dan / atau mengekspos model domain Anda ke klien eksternal, misalnya sebagai layanan WCF. Ini adalah bagaimana Vijay menggambarkan layanan aplikasi juga. Dari sudut pandang ini, layanan aplikasi adalah antarmuka ke domain Anda .
Artikel Jeffrey Palermo tentang Arsitektur Bawang (bagian satu , dua dan tiga ) adalah bacaan yang bagus. Dia memperlakukan layanan aplikasi sebagai konsep tingkat aplikasi , seperti sesi pengguna. Meskipun ini lebih dekat dengan pemahaman saya tentang layanan aplikasi, itu masih tidak sejalan dengan pemikiran saya tentang masalah ini.
Pikiran saya
Saya telah memikirkan layanan aplikasi sebagai dependensi yang disediakan oleh aplikasi . Dalam hal ini aplikasi dapat berupa aplikasi desktop atau layanan WCF.
Domain
Waktu untuk contoh. Anda mulai dengan domain Anda. Semua entitas dan layanan domain apa pun yang tidak bergantung pada sumber daya eksternal diterapkan di sini. Konsep domain apa pun yang bergantung pada sumber daya eksternal ditentukan oleh antarmuka. Berikut ini adalah kemungkinan tata letak solusi (nama proyek dicetak tebal):
Solusi saya
- My.Product.Core (My.Product.dll)
- Layanan Domain
IExchangeRateService
Produk
Produkpabrik
IProductRepository
The Product
dan ProductFactory
kelas telah dilaksanakan dalam perakitan inti. ItuIProductRepository
adalah sesuatu yang mungkin didukung oleh database. Implementasi ini bukan urusan domain dan oleh karena itu didefinisikan oleh antarmuka.
Untuk saat ini, kami akan fokus pada IExchangeRateService
. Logika bisnis untuk layanan ini diimplementasikan oleh layanan web eksternal. Namun, konsepnya masih merupakan bagian dari domain dan diwakili oleh antarmuka ini.
Infrastruktur
Implementasi dependensi eksternal adalah bagian dari infrastruktur aplikasi:
Solusi saya
+ My.Product.Core (My.Product.dll)
- Infrastruktur My.Product (My.Product.Infrastructure.dll)
- Layanan Domain
XEExchangeRateService
SqlServerProductRepository
XEExchangeRateService
mengimplementasikan IExchangeRateService
layanan domain dengan berkomunikasi dengan xe.com . Implementasi ini dapat digunakan oleh aplikasi Anda yang menggunakan model domain Anda, dengan memasukkan perakitan infrastruktur.
Aplikasi
Perhatikan bahwa saya belum menyebutkan layanan aplikasi. Kami akan melihat itu sekarang. Katakanlah kita ingin memberikan IExchangeRateService
implementasi yang menggunakan cache untuk pencarian cepat. Garis besar kelas dekorator ini bisa terlihat seperti ini.
public class CachingExchangeRateService : IExchangeRateService
{
private IExchangeRateService service;
private ICache cache;
public CachingExchangeRateService(IExchangeRateService service, ICache cache)
{
this.service = service;
this.cache = cache;
}
// Implementation that utilizes the provided service and cache.
}
Perhatikan ICache
parameternya? Konsep ini bukan bagian dari domain kami, jadi ini bukan layanan domain. Ini adalah layanan aplikasi . Ini adalah ketergantungan infrastruktur kami yang mungkin disediakan oleh aplikasi. Mari kita perkenalkan aplikasi yang menunjukkan ini:
Solusi saya
- My.Product.Core (My.Product.dll)
- Layanan Domain
IExchangeRateService
Produk
Produkpabrik
IProductRepository
- Infrastruktur My.Product (My.Product.Infrastructure.dll)
- ApplicationServices
ICache
- Layanan Domain
CachingExchangeRateService
XEExchangeRateService
SqlServerProductRepository
- My.Product.WcfService (My.Product.WcfService.dll)
- ApplicationServices
MemcachedCache
IMyWcfService.cs
+ MyWcfService.svc
+ Web.config
Ini semua muncul bersamaan dalam aplikasi seperti ini:
// Set up all the dependencies and register them in the IoC container.
var service = new XEExchangeRateService();
var cache = new MemcachedCache();
var cachingService = new CachingExchangeRateService(service, cache);
ServiceLocator.For<IExchangeRateService>().Use(cachingService);
Ringkasan
Aplikasi lengkap terdiri dari tiga lapisan utama:
- domain
- infrastruktur
- aplikasi
Lapisan domain berisi entitas domain dan layanan domain yang berdiri sendiri. Setiap konsep domain (ini termasuk layanan domain, tetapi juga repositori) yang bergantung pada sumber daya eksternal, ditentukan oleh antarmuka.
Lapisan infrastruktur berisi implementasi antarmuka dari lapisan domain. Implementasi ini dapat memperkenalkan dependensi non-domain baru yang harus disediakan aplikasi. Ini adalah layanan aplikasi dan diwakili oleh antarmuka.
Lapisan aplikasi berisi implementasi layanan aplikasi. Lapisan aplikasi juga dapat berisi implementasi tambahan antarmuka domain, jika implementasi yang disediakan oleh lapisan infrastruktur tidak memadai.
Meskipun perspektif ini mungkin tidak sesuai dengan definisi umum layanan DDD, ia memisahkan domain dari aplikasi dan memungkinkan Anda untuk berbagi perakitan domain (dan infrastruktur) antara beberapa aplikasi.