創建的彙集根從here看這段代碼:的GUID CQRS
[Serializable]
public class CreateClientCommand : Command
{
public string ClientName { get; private set; }
public string Street { get; private set; }
public string StreetNumber { get; private set; }
public string PostalCode { get; private set; }
public string City { get; private set; }
public string PhoneNumber { get; private set; }
public CreateClientCommand(Guid id, string clientName, string street, string streetNumber, string postalCode, string city, string phoneNumber) : base(id)
{
ClientName = clientName;
Street = street;
StreetNumber = streetNumber;
PostalCode = postalCode;
City = city;
PhoneNumber = phoneNumber;
}
}
的GUID這裏是命令只是有關。它不是(可能)創建的聚合根的Guid。獲得Guid的最佳做法是什麼?以及如何將任何潛在的驗證錯誤反饋給將命令放在總線上的代碼?例如像這樣:
_bus.Publish(new CreateClientCommand(
Guid.NewGuid(),
_clientDetailsReport.ClientName,
_clientDetailsReport.Street,
_clientDetailsReport.StreetNumber,
_clientDetailsReport.PostalCode,
_clientDetailsReport.City,
_clientDetailsView.PhoneNumber));
_bus.Commit();
我知道CQRS通常會實現最終的一致性。這意味着它可能需要一段時間才能真正創建客戶端。一些MVC/CQRS代碼使用了這種方法:
[HttpPost]
public ActionResult Add(DiaryItemDto item)
{
ServiceLocator.CommandBus.Send(new CreateItemCommand(Guid.NewGuid(),item.Title,item.Description,-1,item.From,item.To));
return RedirectToAction("Index");
}
顯然,索引頁可能顯示含有一些電網DiaryItems和用戶可能能夠看到最新創建DiaryItem(過了一會兒潛力)。任何反饋將非常感激。謝謝。
在Vernon Vaughn的書中:實現領域驅動設計他們實際上認爲創建聚合根(gu)id是一個基礎設施問題。我想我可以將聚合根(gu)id添加到命令中。你認爲這可以接受嗎? – cs0815
在我上一個項目中,我們轉向了由基礎結構生成的實體標識。他們是字符串。但是不管是誰生成的ID,它當然必須出現在命令中,所以你可以找到它來調用你的域邏輯!我想你的命令上的GUID(可能用於關聯寫入和讀取模型)應顯示在消息包中或命令基礎結構中,而不是每個程序員定義的命令中。 –
您可以提供關於如何關聯讀寫模型的更多參考資料。我也很好奇,我一直認爲命令總線是單向的,那麼在commandBus.Publish(SomeImportantCommand)之後如何獲得消息(aka請求/響應模式?); commandBus.Commit(); – cs0815