如何在应用CQRS时获取ID?

时间:2010-12-05 23:12:08

标签: language-agnostic cqrs

我对CQRS的看法是严格遵循你的命令不会返回任何内容(返回类型为void),所以我的例子非常简单:在创建内容时如何检索ID?

例如,在创建信用卡交易时,返回交易ID似乎非常重要,或者在创建客户时,如果您获得了您创建的客户或客户ID,那么浏览器可以自动导航到例如,该客户页面。

一种解决方案可能是首先要求提供ID,然后使用该ID创建客户或交易,但这看起来很奇怪。

有没有人有这方面的经验,或者现在应该如何以最有效的方式完成?也许我误会了什么?

2 个答案:

答案 0 :(得分:25)

CQRS完全是关于点火,而且由于GUID非常可靠(碰撞风险很低),因此发送GUID可以产生你的自我。

步骤基本上是:

  1. 创建命令
  2. 生成并为其分配您的身份(GUID)
  3. 触发命令
  4. 返回先前生成的标识
  5. 详细了解GUIDs on Wikipedia

答案 1 :(得分: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是更高级别的模块。它有责任正确使用JohnSite。向John提供唯一标识符是此职责的一部分。

你会发现处理某些现实生活系统(如人类)的身份是不可能或非常困难的。当这些系统与您的系统处于同一级别时,就会发生这种情况。典型的例子是人和网站。您的网站永远不会保证正确的人请求该页面。在这种情况下,您应该使用基于概率的方法和可靠的哈希值。