【发布时间】:2019-03-24 02:02:33
【问题描述】:
我正在为一个新项目实施 CQRS 迈出第一步。 按照 CQRS 方法,我使用 MediatR 作为框架来编排我的命令。
我还使用 FluentValidation 和 ValidationBehavior 来实现命令验证。但我正在努力定义在哪里放置验证:
- 在命令中(使用带有 FluentValidation 的 CommandValidator)
- 在命令处理程序中,作为自定义检查
- 在聚合根中(直接在此聚合上调用操作时)
我想了解在哪里放置验证:
- 字段验证(长度、格式、必需...)
- 需要实现 IRepository 的业务规则验证(例如,基于列而不是主键的唯一性)
- 不需要实现 IRepository 的业务规则验证
因为我目前已经实现了它,所以我无法访问我的 聚合 根目录中的 IRepository 实现。由 DI 注入这个存储库的是命令处理程序,它们在聚合根上执行操作,但也负责调用例如保存或添加以最终更新数据库。
【问题讨论】:
-
您在区分这 3 种规则方面是完全正确的。用于字段验证的命令与命令处理程序是基于意见的,但使用存储库的问题与已在 SO 中详细介绍的 DDD 的更基本概念有关。您可能会找到搜索“交叉聚合不变量”的答案。您可以在“设置验证”下找到关于唯一性的具体问题。
标签: c# asp.net-core cqrs