(Okumak istemiyorsanız, altta bir özet var :-)
Ben de uygulama hizmetlerinin kesin tanımıyla mücadele ettim. Vijay'ın cevabı bir ay önce düşünme sürecime çok yardımcı olmasına rağmen, bunun bir kısmına katılmıyorum.
Diğer kaynaklar
Uygulama hizmetleri hakkında çok az bilgi var. Toplam kökler, depolar ve alan hizmetleri gibi konular kapsamlı bir şekilde tartışılmaktadır, ancak uygulama hizmetleri sadece kısaca belirtilir veya tamamen dışarıda bırakılır.
Etki Alanına Dayalı Tasarıma Giriş MSDN Dergisi makalesi , uygulama hizmetlerini etki alanı modelinizi harici istemcilere dönüştürmenin ve / veya bir WCF hizmeti gibi dış istemcilere sunmanın bir yolu olarak açıklamaktadır. Vijay uygulama hizmetlerini de bu şekilde tanımlıyor. Bu açıdan, uygulama hizmetleri alan adınız için bir arayüzdür .
Soğan Mimarlık Jeffrey Palermo'nun makaleleri (bölüm tek , iki ve üç ) iyi bir okuma vardır. Uygulama hizmetlerini , kullanıcının oturumu gibi uygulama düzeyinde kavramlar olarak görür. Bu, uygulama hizmetleri anlayışımla daha yakın olsa da, konu hakkındaki düşüncelerimle hala uyumlu değil.
Düşüncelerim
Uygulama hizmetlerini , uygulamanın sağladığı bağımlılıklar olarak görmeye başladım . Bu durumda, uygulama bir masaüstü uygulaması veya bir WCF hizmeti olabilir.
Alan adı
Bir örnekleme zamanı. Etki alanınızla başlarsınız. Dış kaynaklara bağımlı olmayan tüm varlıklar ve etki alanı hizmetleri burada uygulanır. Dış kaynaklara bağımlı etki alanı kavramları bir arabirim tarafından tanımlanır. İşte olası bir çözüm düzeni (proje adı kalın harflerle gösterilmiştir):
Çözümüm
- My.Product.Core (My.Product.dll)
- DomainServices
IExchangeRateService
Ürün
ProductFactory
IProductRepository
Product
Ve ProductFactory
sınıfları çekirdek düzeneği içinde uygulanmıştır. IProductRepository
Muhtemelen bir veritabanı tarafından desteklenmektedir şeydir. Bunun uygulanması alanın endişesi değildir ve bu nedenle bir arayüz tarafından tanımlanır.
Şimdilik IExchangeRateService
,. Bu hizmetin iş mantığı harici bir web hizmeti tarafından uygulanır. Bununla birlikte, kavramı hala alanın bir parçasıdır ve bu arayüzle temsil edilmektedir.
altyapı
Dış bağımlılıkların uygulanması, uygulamanın altyapısının bir parçasıdır:
Çözümüm
+ My.Product.Core (My.Product.dll)
- My.Product.Infrastructure (My.Product.Infrastructure.dll)
- DomainServices
XEExchangeRateService
SqlServerProductRepository
XEExchangeRateService
uygular IExchangeRateService
ile iletişim kurarak alanı hizmeti xe.com . Bu uygulama, altyapı derlemesini ekleyerek etki alanı modelinizi kullanan uygulamalarınız tarafından kullanılabilir.
Uygulama
Henüz uygulama hizmetlerinden bahsetmediğimi unutmayın. Şimdi bunlara bakacağız. IExchangeRateService
Hızlı aramalar için önbellek kullanan bir uygulama sunmak istediğimizi varsayalım . Bu dekoratör sınıfının ana hatları şöyle görünebilir.
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.
}
ICache
Parametreye dikkat edin mi? Bu konsept alan adımızın bir parçası değildir, dolayısıyla bir alan adı hizmeti değildir. Bu bir uygulama hizmetidir . Uygulama tarafından sağlanabilecek altyapımızın bağımlılığıdır. Bunu gösteren bir uygulama sunalım:
Çözümüm
- My.Product.Core (My.Product.dll)
- DomainServices
IExchangeRateService
Ürün
ProductFactory
IProductRepository
- My.Product.Infrastructure (My.Product.Infrastructure.dll)
- Uygulama Hizmetleri
ICache
- DomainServices
CachingExchangeRateService
XEExchangeRateService
SqlServerProductRepository
- My.Product.WcfService (My.Product.WcfService.dll)
- Uygulama Hizmetleri
MemcachedCache
IMyWcfService.cs
+ MyWcfService.svc
+ Web.config
Tüm bunlar böyle uygulamada bir araya geliyor:
// 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);
özet
Tam bir uygulama üç ana katmandan oluşur:
- alan adı
- altyapı
- uygulama
Etki alanı katmanı, etki alanı varlıklarını ve tek başına etki alanı hizmetlerini içerir. Dış kaynaklara bağımlı olan tüm etki alanı kavramları (bu etki alanı hizmetlerini içerir, ancak havuzları da içerir) arabirimler tarafından tanımlanır.
Altyapı katmanı, arayüzlerin etki alanı katmanından uygulanmasını içerir. Bu uygulamalar, uygulama sağlanması gereken yeni etki alanı dışı bağımlılıklar getirebilir . Bunlar uygulama hizmetleridir ve arabirimlerle temsil edilir.
Uygulama katmanı, uygulama hizmetlerinin uygulanmasını içerir. Altyapı katmanı tarafından sağlanan uygulamalar yeterli değilse, uygulama katmanı ek alan arayüzleri uygulamaları da içerebilir.
Bu perspektif, hizmetlerin genel DDD tanımıyla eşleşmese de, etki alanını uygulamadan ayırır ve etki alanı (ve altyapı) derlemesini çeşitli uygulamalar arasında paylaşmanıza olanak tanır.