language-agnostic cqrs

language agnostic - ¿Cómo obtener ID en crear al aplicar CQRS?



language-agnostic (2)

Mi opinión sobre CQRS es que, cuando se siguen estrictamente, sus comandos no devuelven nada (devuelva el tipo void), por lo que mi ejemplo es realmente sencillo: ¿Cómo recupera una ID al crear algo?

Por ejemplo, al crear una transacción con tarjeta de crédito, parece bastante importante devolver un ID de transacción, o al crear un cliente sería mucho más fácil si obtuviera el cliente que creó o el ID del cliente para que un navegador pueda navegar automáticamente a esa página del cliente. por ejemplo.

Una solución podría ser solicitar primero una identificación y luego crear el cliente o la transacción con esa identificación, pero parece bastante extraño.

¿Alguien tiene alguna experiencia con esto o ahora cómo debe hacerse de la manera más efectiva? Tal vez he entendido mal algo?


Las matrices de Ider / GUID / byte de enteros de cualquier tamaño pueden ser lo suficientemente confiables en la práctica, pero no todas corresponden al requisito teórico (suceden colisiones), mientras que existe una solución teórica válida y se puede aplicar la mayor parte del tiempo.

Formularía la solución como: en la cooperación del sistema de igual nivel, la identidad de una debe estar garantizada por el sistema de un nivel superior. El sistema de nivel superior es el que gestiona la vida útil de los sistemas de cooperación.

Ejemplo :

class John { private readonly int id; public John(int id) { this.id = id; } public void UseSite(Site site) { site.CreateAccount(id, "john"); site.SetPassword(id, "john", "123"); /* ... */ } } class Site { public void CreateAccount(int humanId, string accName) { /* ... */ } public void SetPassword(int humanId, string accName, string pwd) { /* ... */ } /* ... */ } class Program { static void Main(string[] args) { Site s = new Site(); // It''s easy to guarantee the identity while there''s only one object John j = new John(4); Console.ReadLine(); } }

Program es el módulo de nivel superior. Es responsable usar correctamente John y el Site . Proporcionar a John un identificador único es parte de esta responsabilidad.

Encontrarás que es imposible o muy difícil lidiar con la identidad de algunos sistemas de la vida real, como un humano. Ocurre cuando estos sistemas están en el mismo nivel que su sistema. Un ejemplo típico es un humano y un sitio web. Su sitio nunca tendrá una garantía de que la persona correcta solicite la página. En este caso, debe utilizar el enfoque basado en la probabilidad con un hash confiable.


CQRS tiene que ver con disparar y olvidar, y como los GUID son muy confiables (bajo riesgo de colisión), no hay ningún problema al enviar un GUID para que usted se genere.

Los pasos serían básicamente:

  1. Crea tu comando
  2. Genera y asigna tu identidad (GUID)
  3. Dispara el comando
  4. Devuelve la identidad generada anteriormente.

Lea más sobre GUIDs en Wikipedia