【问题标题】:DDD, viewmodel and validation in ASP.NET MVCASP.NET MVC 中的 DDD、视图模型和验证
【发布时间】:2011-01-19 22:11:51
【问题描述】:

我正在开发我的第一个 DDD 应用程序并尝试遵循我在过去几个月中学习的一些基本规则。

我已经使用 Nhibernate 实现了存储库模式。
我以为我可以将我的实体从控制器“移动”到视图,但很快我就意识到这几乎是不可能的。

大多数人似乎更喜欢为每个视图定义特定的视图模型。
我并不特别喜欢重新定义我已经为我的实体创建的字段的想法,但似乎这是唯一的方法。

现在我面临着要附加一些验证规则的情况。
我以为我可以将验证规则(使用 DataAnnotations)附加到实体,但如果我使用视图模型,它就无法工作。

以下是问题:

  • 验证不应该是域模型的一部分吗?
  • 创建模型然后花时间在视图模型上重新映射相同的字段(属性)不是很耗时吗?
  • 如果它至少没有验证规则,这难道不是一个贫血模型吗? 我开始怀疑 DDD 是否真的适合中小型应用程序。

感谢任何帮助/建议。

【问题讨论】:

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


    【解决方案1】:

    这个问题在这里被问了数百次,我已经回答了数百次(所以这让你成为第一百个也是第一个问这个问题的人 :-)):将用户验证逻辑放在你的视图模型上(比如必填字段之类的东西,日期时间格式,...)并将业务验证逻辑放在您的实体上(例如用户名已被占用,用户无法再在您的网站上购买产品,因为他已达到最大配额,...)。

    【讨论】:

    • 我想我们现在有数千人。
    • 你能给我们一个主题/书籍的链接来描述这种服务器端验证吗?我所看到的只是使用 DataAnotation 进行验证。在保存对象时,我们是使用一个新的服务层来负责验证和持久化对象,还是我们有一个只负责服务器端验证的层?谢谢!
    • @šljaker,这取决于您使用的验证框架。就个人而言,我不是数据注释的忠实粉丝。我使用FluentValidation.Net。对于数据库中已经存在用户名等业务规则,不要期望奇迹:查询数据库并查看结果。
    • 感谢您的回答,伙计们。我需要弄清楚如何对我的域实体和我的视图模型进行验证,并使其与 MVC 一起工作。如果你们中的任何人有一些参考,那就太好了。再次感谢。
    • @vandalo,FluentValidation.NET 与 ASP.NET MVC 配合得很好:schotime.net/blog/index.php/2009/05/11/…。这是另一个:richarddingwall.name/2009/08/19/…。就您的领域模型而言,您可以在服务层调用验证。
    【解决方案2】:

    验证不应该是其中的一部分吗? 领域模型?

    我认为它应该在域模型和视图模型上。视图模型上的验证将检查类型--datetime、decimal、int 等的有效输入,而域模型上的验证应检查特定于应用程序的规则。这样,即使您决定使用另一个 UI,业务验证仍将到位,而 UI 将需要处理输入验证。

    创建这个不是很费时间吗 模型,然后花时间重新映射 相同的字段(属性) 视图模型?

    有一些工具可以帮助您,例如,codeplex 上的automapper。在我看来,这会导致 BLL 和 UI 之间的分离更加清晰。

    虽然这种方法总体上更耗时,但它也更具可扩展性。如果您的应用程序将来需要增长,那么这是设计架构的合理方式。

    【讨论】:

    • 谢谢 sTodorov。我正在阅读有关 automapper 的内容,几乎被诱惑了,但我认为我的模型非常简单,而且不会节省时间。
    猜你喜欢
    • 2010-11-18
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2015-02-26
    相关资源
    最近更新 更多