如何在应用CQRS时创buildID?

我对CQRS的看法是严格按照你的命令不返回任何东西(返回types无效),所以我的例子是非常简单的:如何创build一些东西时检索ID?

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

一种解决scheme可能是首先要求一个ID,然后用这个ID创build客户或交易,但看起来很奇怪。

有没有人有这方面的经验或现在应该如何以最有效的方式来完成? 也许我误解了一些东西?

CQRS全是关于“遗忘”的,因为GUID非常可靠(碰撞风险低),所以发送一个GUID是没有问题的。

步骤基本上是:

  1. 创build你的命令
  2. 生成并分配您的身份(GUID)
  3. 发射命令
  4. 返回之前生成的身份

阅读更多关于Wikipedia上的GUID

任何大小的整型id / GUID / byte数组在实际应用中都可以保证足够可靠,但是它们都不符合理论要求(碰撞发生),而有效的理论解决scheme存在并且大部分时间都可以应用。

我认为解决scheme是:在平等的制度下,一个人的身份应该由一个更高层次的体系来保证。 更高层次的系统是pipe理协同操作系统的生命周期的系统。

例如

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

你会发现,处理一些现实生活系统的身份是不可能的或者很难的,就像人类一样。 当这些系统与您的系统处于同一水平时,会发生这种情况。 典型的例子是一个人和一个网站。 您的网站将永远不会有保证,正确的人类请求页面。 在这种情况下,您应该使用基于概率的方法和可靠的哈希。