1

CommandHandlers が他の CommandHandlers と通信できる/できないかどうかについて、いくつかの意見を得ようとしています。

これは、私が遭遇した単純なケースです。次のようなコマンドの ChangePasswordCommandHandler があります。

public class ChangePasswordCommand : Command
{
    public string Email { get; }
    public string OldPassword { get; set; }
    public string NewPassword { get; set; }
}

そのため、ハンドラー内でユーザーの古いパスワードを検証する必要があるため、次の 3 つのオプションがあります。

  1. ValidateCredentialsCommandHandler への呼び出しをディスパッチします。
  2. 検証ロジックの一部を、両方のハンドラーが使用できるサービスに分解します。
  3. 呼び出しプロセスに最初にこのチェックを行わせますが、ビジネス ロジックがドメイン層の外に漏れています。

他のハンドラーへのディスパッチでいくつかの技術的な問題が発生しています。ほとんどの場合、Web リクエストごとのトランザクションを使用しているため、競合しようとしている 2 つのトランザクションがあります。

考え?

4

2 に答える 2

3

コマンド ハンドラはコマンドを処理しますChangePasswordCommandHandlerが検証を にディスパッチする場合ValidateCredentialsCommandHandler、どのコマンドがValidateCredentialsCommandHandler処理しますか?

要するに、いいえ、それは意味がないと思います。

2番目のオプションは、あなたが言及したものから最もよく聞こえます。

于 2010-07-23T07:48:29.770 に答える
0

パスワードを変更するChangePasswordCommandHandlerには、ユーザー ドメイン モデルを呼び出す可能性が高くなります。次に例を示します。

user.changePassword( oldPass, newPass );

次に、changePassword メソッドで古いパスワードの検証を行う必要があります。例えば:

public void changePassword( String oldPass, String newPass ) {
  this.validatePassword( oldPass );
  // continue with password change...
}

このようにして、すべてのドメイン ロジックがドメイン モデルにカプセル化されます。

于 2014-05-12T17:40:56.600 に答える