【问题标题】:Where and how to validate and map ViewModel?在哪里以及如何验证和映射 ViewModel?
【发布时间】:2010-05-07 05:54:39
【问题描述】:

我正在尝试学习领域驱动设计,最近读到很多人主张为您的视图创建一个 ViewModel,以存储您希望在给定视图中显示的所有值。

我的问题是我应该如何进行表单验证?我应该为每个视图创建单独的验证类,还是将它们组合在一起?我也对这在代码中的样子感到困惑。

这就是我目前认为验证和视图模型适合事物方案的方式:

视图(一些用户输入)-> 控制器-> FormValidation(ViewModel)->(如果有效映射到 ViewModel 到域模型)-> 域层服务-> 基础设施

谢谢!

附:我将 Asp.net MVC 与 C# 一起使用

【问题讨论】:

    标签: asp.net-mvc validation domain-driven-design viewmodel


    【解决方案1】:

    我建议您将验证规则放入您的域模型中。这是最简单和重复的方式(例如,使用 System.ComponentModel.DataAnnotations - MVC 2 默认模型绑定器支持开箱即用)。
    如果您有复杂且大范围的域模型,并且您不会被同名的映射属性所困扰 - 请尝试使用 AutoMapper,这是执行此类工作的绝佳工具。

    【讨论】:

      【解决方案2】:

      验证表示层上的视图模型。请记住,您应该只验证与演示相关的验证(日期格式正确,名称!=“”等)。

      Asp.net Mvc 有一些in-built validation support,通常足以进行基本验证。

      应用领域驱动设计时的棘手部分是领域验证。可能存在复杂的规则、对存储库的依赖以及类似的东西,它们可以使“验证运行”而不会使domain model dumb 变得非常困难。

      因此 - 永远不要让域对象滑入invalid 状态并在发生这种情况时抛出异常似乎是个好主意。


      最好不要尝试将视图模型机械地映射到域模型 - 这种方法会增加耦合,可能会破坏域模型的封装并使其变得笨拙。

      【讨论】:

        【解决方案3】:

        我一直在尝试将表单验证放在 ViewModel 中,对于复杂的业务验证,我使用了服务层。

        这实际上运行良好,代码更易于阅读和维护

        【讨论】:

          【解决方案4】:

          这是一个常见问题,而且并不总是有一个正确答案。查看 Derick Bailey 的this post。这是关于这个问题的一个很好的讨论,并且有几个链接到关于这个问题的其他一些很棒的帖子。

          【讨论】:

            猜你喜欢
            • 2011-09-04
            • 1970-01-01
            • 2011-06-27
            • 2011-02-07
            • 2013-02-07
            • 1970-01-01
            • 2010-09-22
            • 2013-01-29
            • 1970-01-01
            相关资源
            最近更新 更多