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
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:
- 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.
- 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.
- 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
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.
- 1. Sagas basadas en tiempo con Event Sourcing
- 2. Event Sourcing: eventos que desencadenan otros y estado de reconstrucción
- 3. Comunicación entre agregados en CQRS + DDD + Event Sourcing
- 4. WPF Built-in Commands
- 5. Cómo administrar los cambios de ViewModel en CQRS + Event Sourcing Architecture
- 6. Winforms Form Constructor vs Load event
- 7. Backbone.js global events
- 8. UISlider events
- 9. ASP.Net Event Loop Order
- 10. WPF Listbox + Expander events
- 11. DataGridView CheckBox events
- 12. ¿Qué ChoiceBox-Event elegir?
- 13. UITableView Edit/Done events
- 14. Dojo: dojo onblur events
- 15. Android Calendar Events
- 16. ¿Fancybox mute Click events?
- 17. backbone.js events y el
- 18. jQuery queue events
- 19. backbone.js collection events
- 20. flash javascript events
- 21. Enlace javascript keypress events
- 22. Multiple Views OnTouch Events
- 23. cross-window javascript events
- 24. Manejo de errores de .NET: try/catch VS event VS valor de retorno/status-fields
- 25. `patrón de on` a Backbone` event` de hash
- 26. HTML File input JS events
- 27. Delphi XE build events .. globally?
- 28. jQuery events en iOS 5
- 29. jQuery Parallax/Scroll Events Rendimiento
- 30. Touch events on MKMapView's overlays
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
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
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