CQRS - CommandHandlers应该调用其他CommandHandler

时间:2010-07-22 21:12:50

标签: .net design-patterns domain-driven-design cqrs

试着就CommandHandler是否可以/应该与其他CommandHandler进行通信获得一些意见。

这是我遇到的一个简单案例。我有一个ChangePasswordCommandHandler,其命令如下所示:

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

所以,在处理程序中我需要验证用户旧密码,所以我看到它有三个选项:

  1. 发出对我的ValidateCredentialsCommandHandler的调用。
  2. 将一些验证逻辑分解为两个处理程序都可以使用的服务。
  3. 让调用进程首先进行此检查,但现在业务逻辑正在我的域层之外泄漏。
  4. 我遇到了一些技术问题,主要是调度到其他处理程序b / c我正在使用每个Web请求的事务,所以我有两个交易尝试竞争。

    思想?

2 个答案:

答案 0 :(得分:3)

命令处理程序处理命令。如果ChangePasswordCommandHandler将验证调度到ValidateCredentialsCommandHandler,那么ValidateCredentialsCommandHandler会处理什么命令?

简而言之 - 不,我认为这没有道理。

第二个选项听起来比你提到的最好。

答案 1 :(得分:0)

为了更改密码,您的ChangePasswordCommandHandler很可能会调用用户域模型,例如:

user.changePassword( oldPass, newPass );

然后应在changePassword方法中验证旧密码。例如:

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

这样,所有域逻辑都封装在域模型中。