【发布时间】:2011-05-08 07:56:12
【问题描述】:
我们试图找出 mvvm 中的验证,在业务逻辑或模型中进行验证。 我已经在我们的业务逻辑中实现了通过异常类型验证 - 可以在此处找到简化图:
如果我们有很多相互独立的输入,则没有问题,抛出异常,文本框捕获它并标记每个错误输入的边界为红色。但是,当我们有依赖值时,我们就有麻烦了。 例如
模型中的 Value1 和 Value2 不能相同,因此我们在每个寻找相等值的人中都有一个验证函数,如果发生这种情况会抛出异常
现在,如果我们将 Value1 设置为 0,将 Value2 设置为 1,一切都很好
Value1 在 GUI 中设置为 1 --> 这个被标记为红色,因为没有触发其他值的验证,所以 GUI 中的 Value2 没有标记为故障
Value2 在 GUI 中设置为 2,现在我们已达到有效状态,但只有 Value2 得到验证,因此 Value1 仍被标记为故障
是否有解决该问题的通用模式?我们不想在两个文本框之间的 GUI 中引入依赖关系,因为这个逻辑应该只存在于业务逻辑层中。
除了实现通过异常验证之外,还可以实现 IDataErrorInfo 接口,但问题仍然存在,没有办法强制依赖值再次验证它们的值,至少我看不到 :)
感谢任何帮助
干杯, 曼尼
[清理,删除不必要的步骤]
15.11.2010 - 第 2 部分
好的,在这里重新考虑一下,我们将使用业务逻辑层。这是我们目前计划的配置: (这里的图片有点小,请在单独的窗口中打开它以全尺寸显示) 一切都或多或少清楚,除了如果业务逻辑下的数据模型发生更改,如何通知不同编辑器的所有视图模型/模型克隆。一种方法是在创建它们的业务逻辑中跟踪克隆模型。当使用业务逻辑 commit() 更改数据模型时,所有其他已注册的模型克隆都可以收到更改通知并进一步传播它们。或者,业务逻辑可以发布一个所有视图模型都订阅的事件,以便他们也获得更改 - 谁能给我提示什么更好?
再次感谢您的帮助,对不起,我的思维如此受阻;)
【问题讨论】:
-
为什么VM在业务层设置属性值?这似乎是您的某些问题的根本原因。每个人(似乎)对 MVVM 的含义略有不同的解释,但恕我直言,该模型是数据模型和控制器的组合,因此它拥有 VM 中数据的超集并协调对 Web 服务/存储库/等的访问.因此,您现有的业务层应该合并到当前模型中,或者可能移到模型之后(即在 WCF 边界的另一侧)。
-
我们正在考虑将模型(这是我们的数据模型)和业务逻辑折叠成一层,如果我理解正确的话,这基本上就是您的意思。但我仍然认为 vm 不应该包含验证。但是字符串传递问题仍然存在。当将业务逻辑移动到 wcf 边界的另一侧时,这是否意味着所有模型都只是一个可以编辑并作为一个整体提交给业务逻辑并在那里评估的哑数据持有者?你有关于使用 wcf 边界和拆分的链接吗?感谢您的帮助
-
当然是在虚拟机中进行验证,但它是简单的验证,例如密码超过 6 个字符 或电子邮件地址是有效格式。您可能希望将业务逻辑与模型分离,考虑对模型->业务逻辑->数据存储库使用 n 层方法(将 BL 和数据层合并到 Web 服务中很常见,但是如果您只是使用本地数据库,则不必如此)。在模型中加入 BL 仍然是比您目前拥有的更好的选择。
-
@slugster:你对 vm 中的简单验证完全正确,我应该更清楚地说明这一点。我已经更新了上面的帖子,遗憾的是无法在此处创建讨论帖。非常感谢,感谢您对我的耐心;)
-
您似乎担心在 VM 中进行验证,这是一个非常合理的问题。 VM 是视图和模型之间的中介。为什么不使用 IDataErrorInfo 将视图通过视图模型的验证委托给模型?将验证放入您的模型中,然后从 VM 中调用该验证?就像客户端 javascript 对服务器执行 XHR 以进行验证一样,所以它都包含在一个地方。
标签: c# validation mvvm business-logic