我对CQRS的看法是严格遵循你的命令不会返回任何内容(返回类型为void),所以我的例子非常简单:在创建内容时如何检索ID?
例如,在创建信用卡交易时,返回交易ID似乎非常重要,或者在创建客户时,如果您获得了您创建的客户或客户ID,那么浏览器可以自动导航到例如,该客户页面。
一种解决方案可能是首先要求提供ID,然后使用该ID创建客户或交易,但这看起来很奇怪。
有没有人有这方面的经验,或者现在应该如何以最有效的方式完成?也许我误会了什么?
答案 0 :(得分:25)
CQRS完全是关于点火,而且由于GUID非常可靠(碰撞风险很低),因此发送GUID可以产生你的自我。
步骤基本上是:
答案 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
是更高级别的模块。它有责任正确使用John
和Site
。向John
提供唯一标识符是此职责的一部分。
你会发现处理某些现实生活系统(如人类)的身份是不可能或非常困难的。当这些系统与您的系统处于同一级别时,就会发生这种情况。典型的例子是人和网站。您的网站永远不会保证正确的人请求该页面。在这种情况下,您应该使用基于概率的方法和可靠的哈希值。