ここからこのコードを見る:
[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 を表示できる場合があります (しばらくすると可能性があります)。どんなフィードバックでも大歓迎です。ありがとう。