目前我们正在进行没有事件采购的CQRS。
我们有命令(例如UpdateUser)和查询(例如:GetUser,GetAllUsers)。
我们的域只在服务器上知道,因为有多个不同的客户端。客户端通过DTO接收数据,他们不知道服务器上的实际实体。
目前,如果我们有一个View和ViewModel,我们想要代表UserDTO并验证它,我们将UserDTO映射到UserDTOValidation对象,其中有一些方法“IsValid()...”等......
现在这可行,但需要大量时间和映射,并且难以在大型解决方案中进行管理。 e.g:
这种验证感觉不对,但它确实有效。
任何人都可以展示更好的工作方式(如果可能的话,代码示例),它确认用户输入+提供反馈并在客户端和服务器上进行验证。
请记住,我们正在与DTO合作,客户端不知道服务器中的实体,只有DTO。
更新
如果已经编辑了UserDTOValidation也具有“IsDirty”属性,因为我们不希望在尚未更改的命令上发送更新命令。我不认为将IsDirty属性和验证添加到DTO本身是可以的。所以这是另一个我不知道如何改进的问题。
答案 0 :(得分:1)
服务器将UserEntity映射到UserDTO
如果您正在应用CQRS,则无需执行此映射。读取方已准备好UserDTO投影。
使用UserDTO发送UpdateUserCommand(存储在 UserDTOValidation)
您不应将UserDTO作为命令参数发送。您应该只向命令提供执行所需的最小数据。
此外,如果您有UpdateUserCommand,您应该重新考虑是否需要使用CQRS,我猜测CRUD会以更简单的方式解决您的问题。
在服务器上收到UserDTO并进行额外验证(例如,查看是否 它是独一无二的,没有重复数据等......)
虽然您可以针对读取端查询预先验证客户端的唯一性,并且在99,9999%的情况下就足够了,但是在某些情况下命令将在域级别失败。
在这种情况下,您将不得不按照您的方式处理它,即等待返回值或可能捕获异常。