Estoy construyendo una aplicación con un modelo de dominio usando CQRS y conceptos de eventos de dominio (pero no fuente de eventos, simplemente SQL antiguo). No hubo ningún problema con los eventos de tipo SomethingChanged. Luego me quedé atrapado en la implementación de eventos SomethingCreated.ID de entidad nueva en el evento de dominio
Cuando creo una entidad que está mapeada en una tabla con clave primaria de identidad, entonces no sé el Id hasta que la entidad persista. La entidad ignora la persistencia, por lo que cuando se publica un evento desde el interior de la entidad, no se conoce el Id; se configura mágicamente después de llamar a context.SaveChanges() solamente. Entonces, ¿cómo/dónde/cuándo puedo poner el Id en los datos del evento?
Estaba pensando:
- La inclusión de la referencia a la entidad en el evento. Eso funcionaría dentro del dominio pero no necesariamente en un entorno distribuido con múltiples sistemas autónomos que se comunican por eventos/mensajes.
- Anulando SaveChanges() para actualizar de alguna manera los eventos en cola para la publicación. Pero los eventos están destinados a ser inmutables, así que esto parece muy sucio.
- Deshacerse de los campos de identidad y usar los GUID generados en el constructor de la entidad. Esto podría ser el más fácil, pero podría afectar el rendimiento y dificultar otras cosas, como la depuración o la consulta (
where id = 'B85E62C3-DC56-40C0-852A-49F759AC68FB'
, noMIN
,MAX
etc.). Eso es lo que veo en muchas aplicaciones de muestra. - Enfoque híbrido: deje la identidad y utilícela principalmente para claves externas y uniones más rápidas, pero use GUID como el identificador único por el cual extraigo las entidades del repositorio en la aplicación.
No incluya una referencia a la entidad en el evento. Está bien insertar la identificación después de guardar. Debe considerarse inmutable al momento de la publicación. Sin embargo, esto podría terminar siendo problemático si va a permitir reintentos dentro del contexto de producción del evento.Hay un valor en la asignación de identificadores desde el exterior, tanto que creo que esta debería ser una estrategia predeterminada. Entonces, tanto el uso de GUID como el enfoque híbrido podrían funcionar. Otro enfoque podría ser algún mecanismo HILO o algo así como copo de nieve. –
¿Podría elaborar sobre HILO y copo de nieve? – Pein
http://nhforge.org/blogs/nhibernate/archive/2009/03/20/nhibernate-poid-generators-revealed.aspx y http://engineering.twitter.com/2010/06/announcing-snowflake.html –