Comment obtenir ID dans create lors de l'application CQRS?

Mon point de vue sur CQRS est quand suivi strictement vos commandes ne renvoient rien (type de retour void), donc mon exemple est vraiment simple: Comment récupérer un ID lors de la création de quelque chose?

Par exemple, lors de la création d'une transaction par carte de crédit, il semble plutôt important de renvoyer un ID de transaction, ou lors de la création d'un client, il serait beaucoup plus facile si vous obteniez le client que vous avez créé ou l'id client afin qu'un navigateur puisse naviguer automatiquement vers cette page client pour exemple.

Une solution pourrait être de demander d'abord un ID, puis de créer le client ou la transaction avec cet ID, mais cela semble assez bizarre.

Quelqu'un a une expérience avec ce ou maintenant comment il devrait être fait de la manière la plus efficace? Peut-être que j'ai mal compris quelque chose?

44
demandé sur Tomas Jansson 2010-12-06 02:12:08

2 réponses

CQRS est tout au sujet du feu et de l'oubli, Et puisque les GUID sont très fiables (faible risque de collision), il n'y a pas de problème à envoyer un GUID que vous générez vous-même.

Les étapes seraient essentiellement:

  1. créez votre commande
  2. générez et attribuez-lui votre identité (GUID)
  3. lancez la commande
  4. renvoie l'identité générée précédemment

En savoir plus sur GUIDs sur Wikipedia

24
répondu Robin Orheden 2010-12-05 23:25:20

Les tableaux / GUID / byte D'Integer id de n'importe quelle taille peuvent être assez fiables à la pratique, mais ils ne correspondent pas tous à l'exigence théorique (les collisions se produisent), alors que la solution théorique valide existe et peut être appliquée la plupart du temps.

Je formulerais la solution comme suit: dans le système de niveau égal, la coopération doit être garantie par le système d'un niveau supérieur. Le système de niveau supérieur est celui qui gère la durée de vie de la coopération système.

Exemple:

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 est le module de niveau supérieur. Il est responsable d'utiliser John et Site correctement. Fournir à John un identifiant unique fait partie de cette responsabilité.

Vous constaterez qu'il est impossible ou très difficile de traiter l'identité de certains systèmes réels, comme un humain. Cela se produit lorsque ces systèmes sont au même niveau que votre système. Exemple typique est un humain et un site web. Votre site n'aura jamais de garantie que l'humain droit demandant la page. Dans ce cas, vous devez utiliser l'approche basée sur les probabilités avec un hachage fiable.

0
répondu astef 2014-07-15 13:47:01