(Si vous n'avez pas envie de lire, il y a un résumé en bas de page :-)
J'ai moi aussi eu du mal à définir précisément les services d'application. Bien que la réponse de Vijay ait été très utile à mon processus de réflexion il y a un mois, j'en suis venu à ne pas être d'accord avec une partie de celle-ci.
Autres ressources
Il y a très peu d'informations sur les services d'application. Des sujets tels que les racines d'agrégats, les référentiels et les services de domaine sont largement abordés, mais les services d'application ne sont que brièvement mentionnés ou carrément ignorés.
L'article du magazine MSDN Une introduction à la conception pilotée par le domaine décrit les services d'application comme un moyen de transformer et/ou d'exposer votre modèle de domaine à des clients externes, par exemple comme un service WCF. C'est ainsi que Vijay décrit également les services d'application. De ce point de vue, les services d'applications sont une l'interface de votre domaine .
Les articles de Jeffrey Palermo sur l'architecture de l'oignon (partie un , deux et trois ) sont une bonne lecture. Il traite les services d'application comme concepts au niveau des applications comme la session d'un utilisateur. Bien que cela soit plus proche de ma compréhension des services d'application, ce n'est toujours pas conforme à mes idées sur le sujet.
Mes réflexions
J'en suis venu à considérer les services d'application comme les dépendances fournies par l'application . Dans ce cas, l'application peut être une application de bureau ou un service WCF.
Domaine
Il est temps de donner un exemple. Vous commencez avec votre domaine. Toutes les entités et tous les services du domaine qui ne dépendent pas de ressources externes sont implémentés ici. Tous les concepts de domaine qui dépendent de ressources externes sont définis par une interface. Voici un exemple de solution possible (le nom du projet est en gras) :
My Solution
- **My.Product.Core** (My.Product.dll)
- DomainServices
IExchangeRateService
Product
ProductFactory
IProductRepository
Le site Product
et ProductFactory
ont été implémentées dans l'assemblage de base. Le site IProductRepository
est quelque chose qui est probablement soutenu par une base de données. L'implémentation de celle-ci ne concerne pas le domaine et est donc définie par une interface.
Pour l'instant, nous allons nous concentrer sur le IExchangeRateService
. La logique commerciale de ce service est mise en œuvre par un service web externe. Cependant, son concept fait toujours partie du domaine et est représenté par cette interface.
Infrastructure
La mise en œuvre des dépendances externes fait partie de l'infrastructure de l'application :
My Solution
+ **My.Product.Core** (My.Product.dll)
- **My.Product.Infrastructure** (My.Product.Infrastructure.dll)
- DomainServices
XEExchangeRateService
SqlServerProductRepository
XEExchangeRateService
met en œuvre la IExchangeRateService
service de domaine en communiquant avec xe.com . Cette mise en œuvre peut être utilisée par vos applications qui utilisent votre modèle de domaine, en incluant l'assemblage d'infrastructure.
Application
Notez que je n'ai pas encore mentionné les services d'application. Nous allons les examiner maintenant. Disons que nous voulons fournir un IExchangeRateService
qui utilise un cache pour accélérer les recherches. Le schéma de cette classe décorateur pourrait ressembler à ceci.
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.
}
Remarquez le ICache
paramètre ? Ce concept ne fait pas partie de notre domaine, il ne s'agit donc pas d'un service du domaine. Il s'agit d'un service des applications . C'est une dépendance de notre infrastructure qui peut être fournie par l'application. Présentons une application qui en fait la démonstration :
My Solution
- **My.Product.Core** (My.Product.dll)
- DomainServices
IExchangeRateService
Product
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
Tout cela se retrouve dans l'application comme ceci :
// 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);
Résumé
Une application complète se compose de trois couches principales :
- domaine
- infrastructure
- application
La couche domaine contient les entités du domaine et les services autonomes du domaine. Tout domaine concepts (cela inclut les services de domaine, mais aussi les référentiels) qui dépendent de ressources externes, sont définis par des interfaces.
La couche infrastructure contient l'implémentation des interfaces de la couche domaine. Ces implémentations peuvent introduire de nouvelles non-domaine les dépendances qui doivent être fournies à l'application. Ce sont les services de l'application et ils sont représentés par des interfaces.
La couche application contient la mise en œuvre des services d'application. La couche application peut également contenir des implémentations supplémentaires des interfaces de domaine, si les implémentations fournies par la couche infrastructure ne sont pas suffisantes.
Bien que ce point de vue ne corresponde pas à la définition DDD générale des services, il sépare le domaine de l'application et permet de partager l'ensemble du domaine (et de l'infrastructure) entre plusieurs applications.