2

CQRSに頭を悩ませようとしています。ここで提供されているコード例から描画しています。私はこのパターンにとても慣れていないので、優しくしてください。

ログオンシナリオを見ています。私が読んだどの例でも実際には示されていないので、このシナリオが好きです。この場合、ユーザーの集約IDが何であるか、または集約IDが存在する場合でも、最初はユーザー名とパスワードだけであるため、わかりません。

fohjinの例では、イベントは常にドメインから発生し(必要な場合)、コマンドハンドラーはドメイン上のメソッドを呼び出します。ただし、ユーザーログオンが無効な場合、何も呼び出すドメインがありません。また、fohjinプロジェクトで定義されている基本コマンド/イベントクラスのすべてではないにしても、ほとんどが集約IDを渡します。

LogonFailureイベントの場合、LogonAuditレポートを更新したい場合があります。

だから私の質問は:特定の集合体に解決されないコマンドをどのように処理するのですか?それはどのように流れますか?

    public void Execute(UserLogonCommand command)
    {
        var user = null;//user looked up by username somehow, should i query the report database to resolve the username to an id?

        if (user == null || user.Password != command.Password)
            ;//What to do here? I want to raise an event somehow that doesn't target a specific user
        else
            user.LogonSuccessful();
    }
4

1 に答える 1

3

ほとんどの場合、CQRSとDDDがシステムの一部にのみ適していることを考慮に入れる必要があります。システム全体をCQRSの概念でモデル化することは非常にまれです。これは、複雑なビジネスドメインを持つ部分に最適であり、特に複雑なビジネスシナリオではロギングユーザーとは呼ばないでしょう。実際、ほとんどの場合、ビジネスとはまったく関係ありません。実際のビジネスドメインは、ユーザーがすでに識別されているときに開始されます。

もう1つ覚えておくべきことは、結果整合性のために、コマンド/イベントを作成するイベントなしで、クエリ側のみを使用してできる限り多くをチェックすることが非常に有益であることです。

ただし、ユーザーログインの成功/失敗に関する情報に意味があると仮定すると、次の手順でシナリオをモデル化します。

  1. ユーザーが名前とパスワードを提供する
  2. 名前/パスワードは、ある種のクエリデータベースに対して検証されます
  3. 提供された資格情報が有効な場合、RegisterValidUserCommand(userId)が実行され、適切なイベントが発生します
  4. 提供された資格情報が有効でない場合、RegisterInvalidCredentialsCommand(providedUserName)が実行され、適切なイベントが発生します

重要なのは、ユーザーの資格情報の確認は必ずしもビジネスドメインの一部ではないということです。

とは言うものの、すべてのコマンドまたはイベントがビジネス関連である必要はないという別の関連概念があります。したがって、集約をロードする必要のないイベントを処理することが可能です。

たとえば、情報のみであり、人の性別に関する情報など、システムのビジネスコンセプトにまったく影響を与えないデータを変更したい場合(ビジネス上の意味がないと仮定して)。

その場合、SetPersonSexCommandを処理するとき、その情報はエンティティに配置する必要がないため、実際には集計をロードする必要はありません。代わりに、PersonSexSetEventを作成して登録し、公開して、クエリ側がそれを画面/ポートに投影できるようにします。 。

于 2012-07-19T13:32:25.800 に答える