我对 CQRS 的看法是,当您严格遵守命令时,不会返回任何内容(返回类型为 void),所以我的示例非常简单:创建内容时如何检索 ID?
例如,在创建信用卡交易时,返回交易 ID 似乎相当重要,或者在创建客户时,如果您获取您创建的客户或客户 ID 会更容易,这样浏览器就可以自动导航到该客户页面为例。
一种解决方案可能是首先要求一个 ID,然后使用该 ID 创建客户或交易,但这似乎很奇怪。
有没有人有这方面的经验或知道如何以最有效的方式完成?也许我误解了什么?
我对 CQRS 的看法是,当您严格遵守命令时,不会返回任何内容(返回类型为 void),所以我的示例非常简单:创建内容时如何检索 ID?
例如,在创建信用卡交易时,返回交易 ID 似乎相当重要,或者在创建客户时,如果您获取您创建的客户或客户 ID 会更容易,这样浏览器就可以自动导航到该客户页面为例。
一种解决方案可能是首先要求一个 ID,然后使用该 ID 创建客户或交易,但这似乎很奇怪。
有没有人有这方面的经验或知道如何以最有效的方式完成?也许我误解了什么?
CQRS 是关于即发即弃的,并且由于 GUID 非常可靠(碰撞风险低),因此发送您自己生成的 GUID 没有问题。
这些步骤基本上是:
在 Wikipedia 上阅读有关GUID 的更多信息
任何大小的整数 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
唯一标识符是此责任的一部分。
你会发现处理一些现实生活系统的身份是不可能或非常困难的,比如人类。当这些系统与您的系统处于同一级别时,就会发生这种情况。典型的例子是一个人和一个网站。您的网站将永远无法保证正确的人请求该页面。在这种情况下,您应该使用基于概率的方法和可靠的散列。