我刚接触CQRS,正在试图理解写操作(领域)中的业务规则验证。我知道应该在客户端验证方面执行有效日期(必填字段、字符串长度、有效电子邮件等)以及基于业务规则/业务域的验证应在领域端执行。实际上,客户端验证规则也应该适用于领域中的命令,因为我们不信任用户。
所以,我们有一个有效的命令(AddEmailToCustomer),并且在命令上调用了命令处理程序。以下是我的验证方法:
1. 在命令处理程序中创建两个命令验证器的实例。 2. 第一个验证器验证命令数据,同样符合客户端验证(必填字段、有效电子邮件等)。 3. 第二个验证器根据第二个验证器内部的逻辑对数据进行验证。比如,“该客户是否活跃”,或其他事项。我知道更改电子邮件不适合这里,但这不重要。重要的是这里有业务验证。 4. 我们查看由Validator.Validate(ICommand cmd)返回的ValidationResult,然后查找其中的错误。 5. 我们将不会从存储库获取客户端来调用AR上的UpdateEmail方法。那么此时我们该怎么做?
在命令处理程序中抛出异常并添加这些错误吗? 将命令发送到错误队列或其他地方吗? 是否使用Bus.Reply响应并返回错误代码?如果是,我该如何处理错误消息? 如何将这些错误通知给用户?我知道我可以稍后通过电子邮件发送它们,但在Web场景中,我可以在命令中发送请求ID(或使用消息ID),并使用请求ID轮询响应,并向用户显示错误消息。
感谢您的指导。
所以,我们有一个有效的命令(AddEmailToCustomer),并且在命令上调用了命令处理程序。以下是我的验证方法:
1. 在命令处理程序中创建两个命令验证器的实例。 2. 第一个验证器验证命令数据,同样符合客户端验证(必填字段、有效电子邮件等)。 3. 第二个验证器根据第二个验证器内部的逻辑对数据进行验证。比如,“该客户是否活跃”,或其他事项。我知道更改电子邮件不适合这里,但这不重要。重要的是这里有业务验证。 4. 我们查看由Validator.Validate(ICommand cmd)返回的ValidationResult,然后查找其中的错误。 5. 我们将不会从存储库获取客户端来调用AR上的UpdateEmail方法。那么此时我们该怎么做?
在命令处理程序中抛出异常并添加这些错误吗? 将命令发送到错误队列或其他地方吗? 是否使用Bus.Reply响应并返回错误代码?如果是,我该如何处理错误消息? 如何将这些错误通知给用户?我知道我可以稍后通过电子邮件发送它们,但在Web场景中,我可以在命令中发送请求ID(或使用消息ID),并使用请求ID轮询响应,并向用户显示错误消息。
感谢您的指导。