Digamos que tenemos una arquitectura inspirada en CQRS, con componentes tales como Comandos, Modelo de dominio, Eventos de dominio, Leer modelos DTO.
Por supuesto, podemos usar objetos de valor en nuestro modelo de dominio. Mi pregunta es, en caso de que también se pueden utilizar en:Objetos de valor en CQRS: dónde usar
- Comandos
- Eventos
- dtos
No he visto ningún ejemplo donde se utilizan los objetos de valor (VO) en los componentes mencionado anteriormente. En cambio, se usan tipos primitivos. Tal vez solo sean los ejemplos simplistas. Después de todo, mi comprensión del uso de VO en DDD es que actúan como un pegamento para toda la aplicación.
Mi motivación:
Comandos.
Digamos que el usuario envía un formulario que contiene campos de dirección. Tenemos Address Value Object para representar este concepto. Al construir un comando en el cliente, debemos validar la entrada del usuario de todos modos, y cuando está bien formado, podemos crear el objeto de Dirección allí mismo e inicializar el Comando con él. No veo la necesidad de delegar la creación del objeto Address en el controlador de comandos.
Eventos de dominio.
El modelo de dominio ya funciona en términos de objetos de valor, por lo que al publicar eventos con VO en lugar de convertirlos a tipos primitivos, podemos evitar algunos códigos de mapeo. Estoy bastante seguro de que está bien usar VO en este caso.
DTOs.
Si nuestros DTO del lado de la consulta pueden contener objetos de valor, esto permite un poco más de flexibilidad. Por ejemplo, si tenemos un objeto Money, podemos elegir si mostrarlo en EUR o USD, sin necesidad de cambiar el Modelo de lectura.
Después de reflexionar sobre esto por un tiempo, mi conclusión: tener objetos ricos en comportamiento en Eventos es simplemente imposible, ya que deben representar datos históricos, y no tenemos forma de serializar el comportamiento hoy. En cuanto a los comandos y modelos de lectura DTO, esto podría funcionar, y todavía no está claro si el acoplamiento que introduce es aceptable o no (de todos modos, esto se trata más de "si las capas de dominio y presentación hacen referencia a la misma implementación de Money VO" en lugar de 'should TransferMoneyCommand contiene Money VO o MoneyDTO'). – driushkin