使用DTO进行MVVM验证和用户反馈

时间:2016-03-04 09:35:04

标签: c# wpf validation mvvm cqrs

目前我们正在进行没有事件采购的CQRS。

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

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

目前,如果我们有一个View和ViewModel,我们想要代表UserDTO并验证它,我们将UserDTO映射到UserDTOValidation对象,其中有一些方法“IsValid()...”等......

现在这可行,但需要大量时间和映射,并且难以在大型解决方案中进行管理。 e.g:

  1. 我们查询GetUser
  2. 服务器将UserEntity映射到UserDTO
  3. 我们收到了UserDTO
  4. 我们将UserDTO映射到UserDTOValidation对象(包装器的种类)
  5. 检查它是否有效UserDTOValidation.IsValid()
  6. 使用UserDTO(存储在UserDTOValidation中)发送UpdateUserCommand
  7. 在服务器上收到UserDTO并进行额外验证(例如,查看它是否唯一,没有重复数据等...)
  8. 如果UserDTO无效,则UpdateUserCommand具有返回值,例如-1。
  9. 这种验证感觉不对,但它确实有效。

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

    请记住,我们正在与DTO合作,客户端不知道服务器中的实体,只有DTO。

    更新

    如果已经编辑了UserDTOValidation也具有“IsDirty”属性,因为我们不希望在尚未更改的命令上发送更新命令。我不认为将IsDirty属性和验证添加到DTO本身是可以的。所以这是另一个我不知道如何改进的问题。

1 个答案:

答案 0 :(得分:1)

  

服务器将UserEntity映射到UserDTO

如果您正在应用CQRS,则无需执行此映射。读取方已准备好UserDTO投影。

  

使用UserDTO发送UpdateUserCommand(存储在   UserDTOValidation)

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

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

  

在服务器上收到UserDTO并进行额外验证(例如,查看是否   它是独一无二的,没有重复数据等......)

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

在这种情况下,您将不得不按照您的方式处理它,即等待返回值或可能捕获异常。