我正在使用MVVM模式构建一个C# WPF应用程序。我有存储库类,使用NHibernate来持久化我的领域模型。
我的模型由较大的树形结构组成(包含操作和阶段的Recipe)。操作和阶段都包含一个动态的键值映射列表作为IDictionary。Operation的对应NHibernate映射为:
现在,这部分很容易且运行良好。Operation类目前是一个几乎没有逻辑的POCO,只是一个简单的数据容器。
我的问题是:我必须根据应用程序从.xml文件中读取的外部模式验证参数。该模式包含单个参数的限制(范围、有效值等)以及多个参数之间的依赖关系(即有效值取决于另一个参数的值)。
最佳的集成验证逻辑的方法是什么?最近几天我阅读了很多,到目前为止,我遇到了以下替代方案:
1. 将验证逻辑添加到模型类本身中。 对此,我不知道如何将验证模式正确注入NHibernate创建的对象中。我不需要一直使用验证功能,只有在用户编辑参数或者我导入操作(例如从备份中)时才需要。因此,我可以在模型类中实现实际的验证逻辑,并在需要验证时使用属性注入验证规则? 将该功能添加到使用NHibernate存储的模型类中是否被认为是良好的做法,还是模型类应该保持“愚蠢”?
2. 为验证逻辑创建一个装饰器类,它包装我的Operation对象。 这样,每次需要验证时都会使用包装器,而只需要显示它时则使用原始模型类。我的问题在于,我的ViewModel类已经是包装器,所以我会得到另一层包装。此外,由于Operation类是较大树结构(Recipe/Operation/Phase)的一部分,因此我需要为集合创建包装器,并将集合更改映射回底层集合,这可能是一个复杂的任务。
3. 创建一个服务类,每当我想要验证操作时就调用它。 我看到的问题是该服务是无状态的,因此必须每次用户更改单个参数时重新验证整个参数列表。这似乎不是最佳方法,特别是当我想为UI触发某种更改事件时,该事件表示参数的验证状态更改时。
对于我的问题,常见的方法是什么?是否有我还没有找到的完美解决方案模式?我的意思是,有很多实现依赖于用于验证的外部模式定义(读取:XML/XSD和类似的文档结构),肯定有一些天才已经找到了我问题的完美解决方案;-) 帮帮我吧!
我的模型由较大的树形结构组成(包含操作和阶段的Recipe)。操作和阶段都包含一个动态的键值映射列表作为IDictionary。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文件中读取的外部模式验证参数。该模式包含单个参数的限制(范围、有效值等)以及多个参数之间的依赖关系(即有效值取决于另一个参数的值)。
最佳的集成验证逻辑的方法是什么?最近几天我阅读了很多,到目前为止,我遇到了以下替代方案:
1. 将验证逻辑添加到模型类本身中。 对此,我不知道如何将验证模式正确注入NHibernate创建的对象中。我不需要一直使用验证功能,只有在用户编辑参数或者我导入操作(例如从备份中)时才需要。因此,我可以在模型类中实现实际的验证逻辑,并在需要验证时使用属性注入验证规则? 将该功能添加到使用NHibernate存储的模型类中是否被认为是良好的做法,还是模型类应该保持“愚蠢”?
2. 为验证逻辑创建一个装饰器类,它包装我的Operation对象。 这样,每次需要验证时都会使用包装器,而只需要显示它时则使用原始模型类。我的问题在于,我的ViewModel类已经是包装器,所以我会得到另一层包装。此外,由于Operation类是较大树结构(Recipe/Operation/Phase)的一部分,因此我需要为集合创建包装器,并将集合更改映射回底层集合,这可能是一个复杂的任务。
3. 创建一个服务类,每当我想要验证操作时就调用它。 我看到的问题是该服务是无状态的,因此必须每次用户更改单个参数时重新验证整个参数列表。这似乎不是最佳方法,特别是当我想为UI触发某种更改事件时,该事件表示参数的验证状态更改时。
对于我的问题,常见的方法是什么?是否有我还没有找到的完美解决方案模式?我的意思是,有很多实现依赖于用于验证的外部模式定义(读取:XML/XSD和类似的文档结构),肯定有一些天才已经找到了我问题的完美解决方案;-) 帮帮我吧!