目前,我们正在执行不带事件源的CQRS。

我们有命令(例如UpdateUser)和查询(例如:GetUser,GetAllUsers)。

我们的域仅在服务器上是已知的,因为有多个不同的客户端。客户端通过DTO接收数据,他们不知道服务器上的实际实体。

当前,如果我们有一个View和ViewModel来表示UserDTO并对其进行验证,我们会将UserDTO映射到UserDTOValidation对象,其中存在一些方法“IsValid()...”等。

现在,此方法可行,但需要花费大量时间和映射,并且在大型解决方案中将很难进行管理。
例如。:

  • 我们查询GetUser
  • 服务器将UserEntity映射到UserDTO
  • 我们收到一个UserDTO
  • 我们将UserDTO映射到UserDTOValidation对象(包装类型)
  • 检查它是否有效UserDTOValidation.IsValid()
  • 发送带有UserDTO的UpdateUserCommand(存储在UserDTOValidation中)
  • UserDTO已在服务器上收到并具有额外的验证(例如,查看它是否唯一,没有重复的数据等)。
  • 如果UserDTO无效,则UpdateUserCommand具有返回值,例如-1。

  • 这种验证感觉不对,但是可以。

    任何人都可以展示一种更好的工作方式(如果可能的话,代码示例)来验证用户输入,并给出反馈并在客户端和服务器上进行验证。

    请记住,我们正在使用DTO,客户端上不知道服务器中的实体,只有DTO是未知的。

    更新:

    UserDTOValidation还具有“IsDirty”属性,以了解是否已对其进行编辑,因为我们不希望发送未更改的更新命令。我认为将IsDirty属性和验证添加到DTO本身并不可行。因此,这是我不知道如何改进的另一个问题。

    最佳答案



    如果要应用CQRS,则不需要执行此映射。读取侧已准备好UserDTO投影。



    您不应该将UserDTO作为命令参数发送。您只应向命令提供执行所需的最小数据。

    另外,如果您有UpdateUserCommand,则应该重新考虑是否需要使用CQRS,我猜CRUD将以更简单的方式解决您的问题。



    尽管您可以针对读取查询在客户端上预先验证唯一性,并且在99,9999%的情况下就足够了,但是在某些情况下,该命令将在域级别失败。

    在这种情况下,您将必须按照自己的方式进行处理,即等待返回值或可能捕获异常。

    关于c# - MVVM验证和DTO的用户反馈,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35792502/

    10-11 16:06