我在使用数据注释进行验证时遇到问题,并且想知道是否有人做过类似的事情。
我们已将域权限放入域层,并且对于每个域实体,我们都有一个MetadataType类,其中包含注释形式的适用业务规则。域实体类还为未使用DataAnnotations实现的任何验证实现IValidatableObject。
在Web /表示层中,我们使用视图模型对象。这些可以是来自多个域实体或单个域实体的数据,现在让我们假设一个域实体。此模型视图使用[MetadataType(typeof(DomainEntityMetaData))]
进行修饰这使我们的业务逻辑保持在域中和视图模型之外。但是,视图模型不实现IValidatableObject,因此永远不会执行。我显然不想在视图中重复验证。
有关如何处理此事的任何建议?
答案 0 :(得分:5)
您的部分问题在于您尝试将域验证放入视图中。虽然这在某些情况下可行,但这实际上违反了“关注分离”原则。视图和域是不同的问题,它们各自都有自己的验证问题。
这尤其是一个问题,因为您的ViewModel对象与您的域模型对象不同,但您尝试将域元数据用作视图模型的验证器。这总会导致问题。
例如,您可能有一个向导,可以跨多个页面逐步创建域对象。如果您通过域验证,则会出现验证问题,因为您没有在各个步骤中填写所需的数据。无论您使用哪种域验证,都必须定义视图验证。这可能意味着重复元数据。
关注的问题经常与DRY交战(不要重复自己)。如果您希望DRY优于SOC,则需要将域模型合并到视图模型中,并为两者使用相同的模型。
在应用程序中使用两个不同的princples会让人感到困惑。您在自己的域中使用SOC,并且希望在视图中使用DRY。这在许多情况下都不起作用。我不知道您为什么要尝试使用域元数据属性来装饰View模型。显然,您的视图模型与您的域模型不同,因此尝试使用域元数据会导致阻塞不匹配。
这并不是说你无法解决问题。你可能会,但它需要黑客攻击MVC的基本设计,添加你自己的扩展件等。问题是,你想做多少工作来节省自己的工作?
答案 1 :(得分:0)