(Se non hai voglia di leggere, c'è un riassunto in fondo :-)
Anch'io ho lottato con la definizione precisa di servizi applicativi. Sebbene la risposta di Vijay sia stata molto utile per il mio processo di pensiero un mese fa, non sono d'accordo con una parte di esso.
Altre risorse
Ci sono pochissime informazioni sui servizi applicativi. Argomenti come radici aggregate, repository e servizi di dominio sono ampiamente discussi, ma i servizi applicativi vengono citati solo brevemente o del tutto esclusi.
L'articolo della rivista MSDN Un'introduzione al design guidato dal dominio descrive i servizi applicativi come un modo per trasformare e / o esporre il modello di dominio a client esterni, ad esempio come servizio WCF. Ecco come Vijay descrive anche i servizi applicativi. Da questo punto di vista, i servizi applicativi sono un'interfaccia per il tuo dominio .
Gli articoli di Jeffrey Palermo sull'architettura delle cipolle ( prima , seconda e terza parte ) sono una buona lettura. Tratta i servizi applicativi come concetti a livello di applicazione , come la sessione di un utente. Sebbene questo sia più vicino alla mia comprensione dei servizi applicativi, non è ancora in linea con i miei pensieri sull'argomento.
I miei pensieri
Ho pensato ai servizi applicativi come alle dipendenze fornite dall'applicazione . In questo caso l'applicazione potrebbe essere un'applicazione desktop o un servizio WCF.
Dominio
Tempo per un esempio. Inizi con il tuo dominio. Tutte le entità e tutti i servizi di dominio che non dipendono da risorse esterne sono implementati qui. Tutti i concetti di dominio che dipendono da risorse esterne sono definiti da un'interfaccia. Ecco un possibile layout di soluzione (nome del progetto in grassetto):
La mia soluzione
- My.Product.Core (My.Product.dll)
- DomainServices
IExchangeRateService
Prodotto
ProductFactory
IProductRepository
Le classi Product
e ProductFactory
sono state implementate nell'assemblaggio principale. Il IProductRepository
è qualcosa che probabilmente è supportato da un database. L'implementazione di questo non è una preoccupazione del dominio ed è quindi definita da un'interfaccia.
Per ora, ci concentreremo sul IExchangeRateService
. La logica aziendale per questo servizio è implementata da un servizio Web esterno. Tuttavia, il suo concetto è ancora parte del dominio ed è rappresentato da questa interfaccia.
Infrastruttura
L'implementazione delle dipendenze esterne fa parte dell'infrastruttura dell'applicazione:
La mia soluzione
+ My.Product.Core (My.Product.dll)
- My.Product.Infrastructure (My.Product.Infrastructure.dll)
- DomainServices
XEExchangeRateService
SqlServerProductRepository
XEExchangeRateService
implementa il IExchangeRateService
servizio di dominio comunicando con xe.com . Questa implementazione può essere utilizzata dalle tue applicazioni che utilizzano il tuo modello di dominio, includendo l'assemblaggio dell'infrastruttura.
Applicazione
Nota che non ho ancora menzionato i servizi applicativi. Vedremo quelli ora. Supponiamo di voler fornire IExchangeRateService
un'implementazione che utilizza una cache per ricerche rapide. Lo schema di questa classe di decoratori potrebbe apparire così.
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.
}
Notare il ICache
parametro? Questo concetto non fa parte del nostro dominio, quindi non è un servizio di dominio. È un servizio applicativo . È una dipendenza della nostra infrastruttura che può essere fornita dall'applicazione. Introduciamo un'applicazione che lo dimostra:
La mia soluzione
- My.Product.Core (My.Product.dll)
- DomainServices
IExchangeRateService
Prodotto
ProductFactory
IProductRepository
- My.Product.Infrastructure (My.Product.Infrastructure.dll)
- ApplicationServices
Icache
- DomainServices
CachingExchangeRateService
XEExchangeRateService
SqlServerProductRepository
- My.Product.WcfService (My.Product.WcfService.dll)
- ApplicationServices
MemcachedCache
IMyWcfService.cs
+ MyWcfService.svc
+ Web.config
Tutto questo si riunisce nell'applicazione in questo modo:
// 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);
Sommario
Un'applicazione completa è composta da tre livelli principali:
- dominio
- infrastruttura
- applicazione
Il livello di dominio contiene le entità di dominio e i servizi di dominio autonomi. Tutti i concetti di dominio (inclusi servizi di dominio, ma anche repository) che dipendono da risorse esterne, sono definiti da interfacce.
Il livello di infrastruttura contiene l'implementazione delle interfacce dal livello di dominio. Queste implementazioni possono introdurre nuove dipendenze non di dominio che devono essere fornite all'applicazione. Questi sono i servizi dell'applicazione e sono rappresentati da interfacce.
Il livello dell'applicazione contiene l'implementazione dei servizi dell'applicazione. Il livello applicazione può contenere anche implementazioni aggiuntive di interfacce di dominio, se le implementazioni fornite dal livello infrastruttura non sono sufficienti.
Sebbene questa prospettiva potrebbe non corrispondere alla definizione generale di servizi DDD, separa il dominio dall'applicazione e consente di condividere l'assemblaggio del dominio (e dell'infrastruttura) tra diverse applicazioni.