ASP.NET MVC中的DDD,viewmodel和验证

时间:2011-01-19 22:11:52

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

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

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

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

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

以下是问题:

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

我感谢任何帮助/建议。

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

  

验证不应成为其中的一部分   域模型?

我认为它应该在域模型和视图模型上。对viewmodels的验证将检查有效输入以键入--datetime,decimal,int等,而域模型上的验证应检查特定于应用程序的规则。通过这种方式,即使您决定使用其他UI,业务验证仍将存在,而UI将需要处理输入验证。

  

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

有些工具可以帮助您解决这个问题,例如,{code}上的automapper。在我看来,这导致了BLL和UI之间更清晰的分离。

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