(Si no tiene ganas de leer, hay un resumen en la parte inferior :-)
Yo también he luchado con la definición precisa de los servicios de aplicaciones. Aunque la respuesta de Vijay fue muy útil para mi proceso de pensamiento hace un mes, he llegado a estar en desacuerdo con parte de ella.
Otros recursos
Hay muy poca información sobre los servicios de aplicaciones. Temas como raíces agregadas, repositorios y servicios de dominio se discuten ampliamente, pero los servicios de aplicaciones solo se mencionan brevemente o se omiten por completo.
El artículo de MSDN Magazine, Introducción al diseño impulsado por dominio, describe los servicios de aplicaciones como una forma de transformar y / o exponer su modelo de dominio a clientes externos, por ejemplo, como un servicio WCF. Así es como Vijay describe los servicios de aplicaciones también. Desde este punto de vista, los servicios de aplicaciones son una interfaz para su dominio .
Los artículos de Jeffrey Palermo sobre la arquitectura de la cebolla (parte uno , dos y tres ) son una buena lectura. Trata los servicios de aplicaciones como conceptos de nivel de aplicación , como la sesión de un usuario. Aunque esto está más cerca de mi comprensión de los servicios de aplicaciones, todavía no está en línea con mis pensamientos sobre el tema.
Mis pensamientos
He llegado a pensar en los servicios de aplicaciones como dependencias proporcionadas por la aplicación . En este caso, la aplicación podría ser una aplicación de escritorio o un servicio WCF.
Dominio
Tiempo para un ejemplo. Empiezas con tu dominio. Aquí se implementan todas las entidades y los servicios de dominio que no dependen de recursos externos. Cualquier concepto de dominio que dependa de recursos externos está definido por una interfaz. Aquí hay un posible diseño de solución (nombre del proyecto en negrita):
Mi solución
- My.Product.Core (My.Product.dll)
- DomainServices
IExchangeRateService
Producto
ProductFactory
IProductRepository
Las clases Product
y ProductFactory
se han implementado en el ensamblaje central. El IProductRepository
es algo que probablemente está respaldado por una base de datos. La implementación de esto no es asunto del dominio y, por lo tanto, está definida por una interfaz.
Por ahora, nos centraremos en el IExchangeRateService
. La lógica de negocios para este servicio es implementada por un servicio web externo. Sin embargo, su concepto sigue siendo parte del dominio y está representado por esta interfaz.
Infraestructura
La implementación de las dependencias externas son parte de la infraestructura de la aplicación:
Mi solución
+ My.Product.Core (My.Product.dll)
- My.Product.Infrastructure (My.Product.Infrastructure.dll)
- DomainServices
XEExchangeRateService
SqlServerProductRepository
XEExchangeRateService
implementa el IExchangeRateService
servicio de dominio comunicándose con xe.com . Esta implementación puede ser utilizada por sus aplicaciones que utilizan su modelo de dominio, incluyendo el ensamblaje de infraestructura.
Solicitud
Tenga en cuenta que aún no he mencionado los servicios de aplicaciones. Los veremos ahora. Digamos que queremos proporcionar una IExchangeRateService
implementación que use un caché para búsquedas rápidas. El esquema de esta clase de decorador podría verse así.
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.
}
Observe el ICache
parámetro? Este concepto no es parte de nuestro dominio, por lo que no es un servicio de dominio. Es un servicio de aplicación . Es una dependencia de nuestra infraestructura que puede proporcionar la aplicación. Vamos a presentar una aplicación que demuestra esto:
Mi solución
- My.Product.Core (My.Product.dll)
- DomainServices
IExchangeRateService
Producto
ProductFactory
IProductRepository
- My.Product.Infrastructure (My.Product.Infrastructure.dll)
- Servicios de aplicación
Dolor
- DomainServices
CachingExchangeRateService
XEExchangeRateService
SqlServerProductRepository
- My.Product.WcfService (My.Product.WcfService.dll)
- Servicios de aplicación
MemcachedCache
IMyWcfService.cs
+ MyWcfService.svc
+ Web.config
Todo esto se combina en la aplicación de esta manera:
// 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);
Resumen
Una aplicación completa consta de tres capas principales:
- dominio
- infraestructura
- solicitud
La capa de dominio contiene las entidades de dominio y los servicios de dominio independientes. Los conceptos de dominio (esto incluye servicios de dominio, pero también repositorios) que dependen de recursos externos, están definidos por interfaces.
La capa de infraestructura contiene la implementación de las interfaces de la capa de dominio. Estas implementaciones pueden introducir nuevas dependencias que no sean de dominio a las que se debe proporcionar la aplicación. Estos son los servicios de aplicación y están representados por interfaces.
La capa de aplicación contiene la implementación de los servicios de la aplicación. La capa de aplicación también puede contener implementaciones adicionales de interfaces de dominio, si las implementaciones proporcionadas por la capa de infraestructura no son suficientes.
Aunque esta perspectiva puede no coincidir con la definición general de servicios DDD, separa el dominio de la aplicación y le permite compartir el ensamblaje de dominio (e infraestructura) entre varias aplicaciones.