54

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

例如,在创建信用卡交易时,返回交易 ID 似乎相当重要,或者在创建客户时,如果您获取您创建的客户或客户 ID 会更容易,这样浏览器就可以自动导航到该客户页面为例。

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

有没有人有这方面的经验或知道如何以最有效的方式完成?也许我误解了什么?

4

2 回答 2

32

CQRS 是关于即发即弃的,并且由于 GUID 非常可靠(碰撞风险低),因此发送您自己生成的 GUID 没有问题。

这些步骤基本上是:

  1. 创建你的命令
  2. 生成您的身份 (GUID) 并将其分配给它
  3. 触发命令
  4. 返回之前生成的身份

在 Wikipedia 上阅读有关GUID 的更多信息

于 2010-12-05T23:13:22.823 回答
0

任何大小的整数 id's / GUIDs / byte 数组在实践中都足够可靠,但它们都不符合理论要求(发生冲突),而有效的理论解决方案存在并且大部分时间都可以应用。

我将解决方案表述为:在同等级别的系统合作中,一个人的身份应该由更高级别的系统来保证。高级系统是管理协作系统生命周期的系统。

示例

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唯一标识符是此责任的一部分。

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

于 2014-07-15T13:47:01.997 回答