【发布时间】:2012-10-01 21:07:37
【问题描述】:
我正在使用 MVVM 模式构建一个 C# WPF 应用程序。我有使用 NHibernate 来持久化我的域模型的存储库类。
我的模型包含一个更大的树结构(Recipes 包含 Operations 包含 Phases)。操作和阶段都包含一个动态的键值映射列表作为IDictionary<string, string>。 Operation 对应的 NHibernate 映射是
<class name="Operation" table="operations">
<id column="id" type="int" generator="native" />
<property name="Name" column="name" />
<map name="Parameters" table="operation_params">
<key column="operation" />
<index column="param" type="string" />
<element column="value" type="string" />
</map>
<list name="Phases" cascade="all-delete-orphan">
<key column="operation" />
<index column="`index`" />
<one-to-many class="Phase" />
</list>
</class>
现在,这部分很简单,而且效果很好。 Operation 类目前是一个内部几乎没有逻辑的 POCO,一个简单的数据容器。
我的问题是:我必须根据我的应用程序从 .xml 文件中读取的外部模式来验证参数。架构包含对单个参数(范围、有效值等)的限制以及多个参数之间的依赖关系(即有效值取决于另一个参数的值)。
集成验证逻辑的最佳方式是什么?过去几天我读了很多书,直到现在,我偶然发现了以下替代方案:
-
将验证逻辑添加到模型类本身。
为此,我不知道如何将验证模式正确地注入到 NHibernate 创建的对象中。我并不总是需要验证功能,只有在用户编辑参数或导入操作(例如从备份)时。所以也许我可以在模型类中实现实际的验证逻辑,并在我真正需要验证时使用属性注入验证规则? 将该功能添加到我使用 NHibernate 存储的模型类中是否被认为是一种好的做法,或者模型类是否应该保持“哑”?
-
为环绕我的
Operation对象的验证逻辑创建一个装饰器类。这样我会在每次需要验证时使用包装器,而当我只需要显示它时使用裸模型类。我的问题是我的 ViewModel 类已经是包装器,所以我会在这里得到另一层包装。此外,由于 Operation 类是较大树结构(配方/操作/阶段)的一部分,我需要为集合创建包装器并将集合更改映射回底层集合,这可能是一项复杂的任务。
-
创建一个服务类,只要我想验证它,我就会调用它来传递操作。
我在这里看到的问题是服务是无状态的,因此每次用户更改单个参数时都必须重新验证整个参数列表。这似乎不是最好的方法,尤其是当我想在参数的验证状态更改时为 UI 触发某种更改事件时。
解决我的问题的常用方法是什么?有没有我还没有找到完全符合我需要的模式?我的意思是,有很多实现依赖于外部模式定义进行验证(阅读:XML/XSD 和类似的文档结构),只需要一些天才已经找到了我的问题的完美解决方案;-)帮帮我吧!
【问题讨论】:
标签: c# wpf validation nhibernate mvvm