54

CQRS に対する私の見解は、厳密に従えばコマンドが何も返さない (戻り値の型が void) ということです。したがって、私の例は非常に簡単です。

たとえば、クレジット カード トランザクションを作成する場合、トランザクション ID を返すことがかなり重要であると思われます。また、顧客を作成する場合、作成した顧客または顧客 ID を取得してブラウザがその顧客に自動的に移動できるようにすると、はるかに簡単になります。たとえばページ。

解決策の 1 つは、最初に ID を要求してから、その ID を使用して顧客またはトランザクションを作成することですが、かなり奇妙に思えます。

誰かがこれを経験したことがありますか、または最も効果的な方法でそれを行う方法を知っていますか? 多分私は何かを誤解しましたか?

4

2 に答える 2

32

CQRS はファイア アンド フォーゲットがすべてであり、GUID は非常に信頼性が高い (衝突のリスクが低い) ため、自分で生成した GUID を送信しても問題はありません。

手順は基本的に次のようになります。

  1. コマンドを作成する
  2. ID (GUID) を生成して割り当てる
  3. コマンドを発射する
  4. 以前に生成された ID を返します

ウィキペディアで GUID の詳細を読む

于 2010-12-05T23:13:22.823 に答える
0

任意のサイズの整数 ID / GUID / バイト配列は、実際には十分に信頼できますが、有効な理論上の解決策が存在し、ほとんどの場合適用できますが、それらはすべて理論上の要件に対応していません (衝突が発生します)。

私は解決策を次のように定式化します: 同等レベルのシステム協力では、自分のアイデンティティはより高いレベルのシステムによって保証されるべきです. 上位システムは、連携するシステムの存続期間を管理するシステムです。

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上位モジュールです。正しく使用する責任がJohnあります。Site一意の識別子を提供Johnすることは、この責任の一部です。

人間のようないくつかの現実のシステムのアイデンティティを扱うことは不可能または非常に難しいことに気付くでしょう。これらのシステムがあなたのシステムと同じレベルにある場合に発生します。典型的な例は、人間と Web サイトです。あなたのサイトには、適切な人間がページをリクエストしたという保証はありません。この場合、信頼できるハッシュで確率ベースのアプローチを使用する必要があります。

于 2014-07-15T13:47:01.997 に答える