领域对象验证与视图模型验证

9
我正在使用ASP.NET MVC 3,并使用FluentValidation来验证我的视图模型。我有点担心我可能不在正确的轨道上。就我所知,模型验证应该在领域对象上完成。现在,在MVC中,您可能会有多个类似的视图模型需要验证。如果一个属性从一个领域对象出现在多个视图模型中,会发生什么?现在您正在对同一属性进行两次验证,它们甚至可能不同步。所以,如果我有一个名为User的领域对象,那么我想对这个对象进行验证。现在,如果我有UserAViewModel和UserBViewModel,那么就需要进行多个验证。
在我的News类中,我有一个名为Title的属性,这是一个必填字段。在我的视图模型中,我也有一个Title属性,我使用AutoMapper将News和NewsViewModel映射。因此,此验证会发生两次。领域模型验证何时发生,视图模型验证何时发生?
以上情况只是一个例子,请勿过于批评。
2个回答

16

这是一个微妙的区别,你的视图模型上的验证是用来验证正确的用户输入并形成反腐层,而你的领域模型上的“验证”则是强制执行业务规则。在两个层面上都进行验证非常正常,事实上,UserAViewModel可能会与UserBViewModel具有略微不同的输入验证。至于你的问题,一般来说,我尽量避免通过我的ViewModel公开领域对象,而是将它们映射起来(通常使用类似AutoMapper的东西),这样你的ViewModels就真正成为了反腐层,而不是领域模型的属性袋。希望能对你有所帮助。


@Paul:是的,我用 AutoMapper 将它们映射起来了。但是假设标题是必填字段,那么我需要在视图模型和领域模型上都将其标记为必填吗?当视图模型被映射到领域对象时,是否需要再次对领域模型进行验证? - Brendan Vogt
1
是Raoul ;) 是的,在这种情况下,我会在视图模型的验证器中设置一个非空规则,并在域模型的属性设置器中进行一个NullOrEmpty检查。这可能看起来有点繁琐,但如果您稍后放弃UI或具有不同的接口到您的域模型(例如Web服务),那么您可以放心地确保所有业务规则都在域层得到了正确执行。 - Raoul
谢谢,这正是我所思考的问题,如果我需要分享我的业务对象(例如),会发生什么? - Brendan Vogt

1
如果一个领域对象的属性出现在多个视图模型中会发生什么?
这不应该发生。视图模型应该完全与您的领域分离。
这回答了你的问题吗?

不,对我来说还是不太清楚。让我举个例子。在我的News类中,我有一个名为Title的属性,它是一个必填字段。在我的视图模型中,我也有一个Title属性,我使用AutoMapper将News和NewsViewModel进行映射。因此,这个验证会发生两次。领域模型验证何时发生,视图模型验证何时发生。请使用我的News和NewsViewModel更新您的答案 :) - Brendan Vogt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接