2011-07-13 15 views
9

Entiendo la diferencia entre comandos y eventos pero en muchos casos terminas con redundancia y mapeo entre 2 clases que son esencialmente las mismas (ThingNameUpdateCommand, ThingNameUpdatedEvent). Para estos casos simples, ¿puedes/usas el evento también como un comando? ¿La gente serializa en una tienda todos los comandos y todos los eventos? Parece ser un poco redundante para mí.Event Sourcing Commands vs Events

Respuesta

12

Todo gran cantidad de esta redundancia es por una razón, en general, y desea evitar el uso del mismo mensaje para dos propósitos diferentes para un número de razones:

  1. eventos con fuente deben ser versionados cuando cambian ya que se almacenan y se reutilizan (deserializan) cuando se hidrata una raíz de agregado. Hará las cosas un poco incómodas si la clase también se usa como un mensaje.
  2. Se ha aumentado el acoplamiento, la misma clase ahora está siendo utilizada por los controladores de comando, el modelo de dominio y los controladores de eventos ahora. Desacoplar el lado del comando del evento puede simplificar la vida para usted en el futuro.
  3. Finalmente claridad. Los comandos se emiten en un idioma que pide que se haga algo (imperativo en general). Los eventos son representaciones de lo que sucedió (pasado en general). Este lenguaje se confunde si usa la misma clase para ambos.

Al final, estas son solo clases de datos, no es que este sea un código "difícil". Hay formas de evitar realmente algunos de los tipeos para escenarios simples como code-gen. Por ejemplo, sé que Greg ha usado transformaciones XML y XSD para crear todas las clases necesarias para un dominio dado en el pasado.

Diría que para muchos casos simples es posible que desee preguntar si esto es realmente dominio (es decir, comportamiento de modelado) o solo datos. Si solo se trata de datos, considere no utilizar el abastecimiento de eventos aquí. A continuación, hay una sesión similar a una charla que Udi Dahan dio sobre cómo dividir el modelo de tu dominio, de modo que no todo requiere de un evento. Estoy de acuerdo con esta forma de pensar ahora mismo.

http://skillsmatter.com/podcast/design-architecture/talk-from-udi-dahan

1

Después de trabajar a través de algunos ejemplos y en especial la presentación Greg Young (http://www.youtube.com/watch?v=JHGkaShoyNs) he llegado a la conclusión de que los comandos son redundantes. Simplemente son eventos de su usuario, ellos presionaron ese botón. Debe almacenarlos exactamente de la misma manera que otros eventos porque son datos que no sabe si desea usarlos en una vista futura. Su usuario agregó y luego eliminó ese artículo de la cesta o al menos intentó hacerlo. Posteriormente, puede querer utilizar esta información para recordarle al usuario esto en una fecha posterior.

+0

Me estoy inclinando en esta dirección también. Leí algunos buenos comentarios acerca de que desea que su evento contenga todos los datos que necesita para hacer el trabajo, especialmente cuando esos datos pueden provenir de sistemas externos que no tienen una representación histórica. Pero también puedes simplemente aplicar esa buena práctica a los Comandos. Especialmente creo que si quieres hacer algo muy DDD, no debería haber una diferencia real entre comandos o eventos. La intención debe ser clara y se deben incluir datos históricos fuera de su dominio. – Arwin

+0

Sigo siendo de la opinión de que los comandos son redundantes. Solo llamo a lo que hago abastecimiento de eventos funcionales. Un blog reciente mío con ES y F # Elm como un sistema completo: http://anthonylloyd.github.io/blog/2016/11/27/event-sourcing – Ant

+0

También creo que la diferencia para mí es utilizar FP en lugar de OO . ES se asigna a FP muy bien con los tipos de suma siendo un esquema de evento extensible natural. La inmutabilidad también encaja muy bien con ES. – Ant