我正在努力解决这个问题的最佳方法。我正在导入包含一堆用户的文件,所以我创建了一个名为ImportUsersCommandHandler
,我的命令是ImportUsersCommand
,它以List<User>
作为参数之一。
[在处理程序中,对于我需要导入的每个用户,我必须确保UserType
有效,这是造成混乱的地方。我需要对数据库进行查询,以获取所有列表可能的用户类型,并且比我要导入的每个用户,我要验证导入中的user type id
是否与数据库中的一个匹配。
我有3个选项。
GetUserTypesQuery
,并获取其余信息,然后将其作为列表传递给ImportUsersCommand并在命令处理程序中进行验证GetUserTypesQuery
而不传递它(命令调用另一个查询)GetUsersTypeQuery
,仅在命令内执行查询结果(仍然是查询,但不涉及查询/处理程序)我觉得所有这些都是肮脏的解决方案,不是应用CQRS的正确方法。
我同意选项1听起来最好,但可能建议添加pre处理程序以验证您的输入?
所以ImportUsersCommandHandler负责导入数据(仅导入数据),并添加一个在验证之前运行的处理程序(在您的示例中,检查用户类型,也许还检查其他内容),并且保证数据不会通过。因此,它查询数据库,检查用户类型并在失败时执行所需的任何操作。否则,它只会传递给您的business处理程序(ImportUsersCommandHandler)。
我已经习惯在NET Core中使用Mediatr,并且此模式很好用(这是我们的工作,所以很抱歉,如果这不适合您的环境/设置!