如何避免在我的ViewModel和业务/域对象上重复验证规则?
例如,我可以在我的ViewModel上使用DataAnnotation属性,这将在我的MVC Web应用程序中为我提供客户端和服务器端验证。但是这个ViewModel通常会被映射到一个业务/域对象并被赋予服务预先形成一些业务逻辑,这意味着验证必须再次发生,通常使用相同或类似的规则。无论如何围绕这个吗?
答案 0 :(得分:6)
我认为你所描述的是正常的和可接受的。将您的UI和数据注释视为友好的UI验证,能够立即向用户显示输入数据的任何验证问题。
我会认为您的Business / Domain对象的验证是完整的验证,不仅仅是验证值,而是强制执行业务规则(例如 - 将项目添加到购物车 - >库存中的物品是什么?)
然后总是有后端验证,通常由数据库强制执行(即允许列中的空值)。除非您的数据库允许在所有字段中使用空值,否则您实际执行的验证不仅仅是您提到的两个地方,而且我认为这是一件好事。
我认为最重要的是,您可能希望您的Business / Domain对象强制执行所有验证,并且您的客户端和后端验证只需执行最基本的验证。
希望有所帮助。
答案 1 :(得分:0)
如果你想验证两个独立的对象并避免重复代码,那么我想你可能会找到一个你不想听的答案。
我能想到的唯一例外是获取返回的视图模型(未经验证)并填充模型,就像执行数据库操作一样,然后在那里进行验证检查。如果有错误,请将它们带回ModelState字典并将视图返回给浏览器并显示错误。这种方法有很大的副作用,你会失去客户端集成,或者充其量 - 它涉及到服务器端的大量AJAX调用。
就个人而言,我接受失败并接受你将会重复工作,并确保尽可能多的代码可重复使用(例如,可以放在你的两个视图模型上的数据注释属性)和商业模式。
检查您的视图模型应确保提供的信息是正确的,例如:
检查您的商家模式,检查数据是否正确。 e.g。
但是,对于业务逻辑,如果您担心数据可能会被替代接口的不一致检查(或您的遗忘)污染,那么将一些方法复制到业务逻辑或模型元数据中。