He leído Evans, Nilsson y McCarthy, entre otros, y entiendo los conceptos y el razonamiento detrás de un diseño impulsado por el dominio; sin embargo, me resulta difícil reunir todos estos elementos en una aplicación real. La falta de ejemplos completos me ha dejado rascándome la cabeza. He encontrado una gran cantidad de marcos y ejemplos simples, pero nada hasta el momento que realmente demuestre cómo crear una aplicación comercial real después de un DDD.Conectando los puntos con DDD
Utilizando el típico sistema de gestión de pedidos como ejemplo, tome el caso de cancelación de la orden. En mi diseño, puedo ver un OrderCancellationService con un método CancelOrder que acepta el orden # y un motivo como parámetros. A continuación, tiene que realizar los 'pasos' siguientes:
- verificar que el usuario actual tiene los permisos necesarios para cancelar un pedido
- recuperar la entidad Orden con el orden especificado # Del OrderRepository
- Verificar que la orden puede ser cancelada (¿el servicio debe interrogar el estado de la orden para evaluar las reglas o la orden debe tener una propiedad CanCancel que encapsula las reglas?)
- Actualice el estado de la entidad de orden llamando a Order.Cancel (razón)
- Persista la actualización d Solicitar al almacén de datos
- en contacto con el CreditCardService para revertir cualquier cargo de tarjeta de crédito que ya han sido procesados
- Añadir una entrada de auditoría para la operación
Por supuesto, todo esto debe suceder en una transacción y ninguna de las operaciones debería permitirse que ocurra de manera independiente. Lo que quiero decir es que debo revertir la transacción de la tarjeta de crédito si cancelo el pedido, no puedo cancelar y no realizar este paso. Esto, imo, sugiere una mejor encapsulación pero no quiero tener una dependencia del CreditCardService en mi objeto de dominio (Order), por lo que parece que esto es responsabilidad del servicio de dominio.
Estoy buscando a alguien que me muestre ejemplos de código de cómo esto podría/debería ser "ensamblado". El proceso de pensamiento detrás del código sería útil para lograr que conecte todos los puntos por mí mismo. ¡Gracias!
¿Por qué no querría la 'búsqueda', la gestión de transacciones y la llamada para persistir en los cambios dentro del servicio? Parece que garantizaría un uso adecuado en todo momento. – SonOfPirate
Búsqueda - tal vez. La gestión de transacciones no pertenece al servicio de dominio, por lo general se implementa en la capa de aplicación (llamante del servicio de dominio). Los cambios de llamada para persistir son manejados por ORM o UnitOfWork ya que estamos cambiando los objetos existentes, no se necesita una llamada explícita en el caso NHibernate. La idea es mantener el código de dominio tan persistente como sea posible. – Dmitry
Sí, usaría un OrderRepository y UoW para mantener el dominio lo más parecido posible a la persistencia, pero nada impide que el código de la aplicación llame a su servicio de cancelación sin persistir los cambios en la entidad Order. Siendo agnóstico, no pensé que importara hasta ahora que no estamos usando NHibernate, por lo que cualquier suposición basada en ese ORM no es válida. – SonOfPirate