2

ここからこのコードを見る:

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

4

3 に答える 3

2

これを行う最も簡単な方法は、コマンドで渡す GUID を実際の集約 ID として使用することです。その後、GUID を手元に置いて、イベントで通知されるのを待つ必要はありません。

于 2014-06-24T14:30:12.900 に答える
2

コマンド自体の ID と、それが作成する可能性のあるエンティティの ID の違いについてお尋ねですか? 前者は通常、インフラストラクチャの問題であり、メッセージ エンベロープのようなもので見つかったり、RPC プロトコルに埋め込まれたりします。後者はドメインの一部になります。(ただし、多くの場合、エンティティの ID をインフラストラクチャの問題として扱うのは良いことです。これは、永続化モデルで便宜上選択する場合があるためです。)

于 2014-06-24T14:19:22.317 に答える
1

コマンドに id がある理由がわかりません (はい、一部の分散システムはこれを使用しますが、最後の手段にする必要があります)。ほとんどの開発者は、これを集計の ID と見なします。

通常は、集約 ID を作成し、コマンドで送信するだけです。結局、コマンドはエンティティを作成しています..

ほとんどの場合、エラーを戻すことができるようにコマンドを同期する必要があります。非同期コマンドを使用すると、成功または失敗のコールバックが必要になります (また、非同期は、システムに多くのコストを追加する必要がある場合にのみ使用する必要があります)。

A) 結果整合性を処理するシステムであり、多くのビジネス ロジックがこれを行います。たとえば、取引所または第三者が何かを処理するのを待っている場合、作業はその情報を待っています。(つまり、コマンドは注文を作成しますが、注文の処理、たとえば、OrderDetail がまだ存在せず、注文が注文処理中の状態になっている可能性があります) B) 続行する前に、コマンドに対して成功、タイムアウト、または失敗の応答があります。

于 2014-06-26T23:36:21.887 に答える