2012-01-20 94 views
3

如何在下列情况下构建代码:你在哪里放置验证逻辑?

若干业务对象(例如Person,House等)以及它们之间需要验证用户输入(来自文本框)。但愿进去之一:

  1. 每个业务对象
  2. 的代码隐藏的WinForms
  3. 一个单独的(静态?)类。

感谢

回答

2

每个业务对象。我经典地使每个实现了一个IValidator接口,它为对象吐出所有验证错误。

4

我在这种情况下支持的一种非常广泛使用的方法是引入视图模型的概念:聚合所有要在表单中显示的数据的类,并指定(通过属性或其他机制)应该对这些数据执行什么类型的验证。

这种方法有几个好处,其中包括:

  • 从模型去耦验证逻辑(或许还有你今天要强制执行,但不是在你的数据本身所固有的验证场景);通过这种方式,您可以为相同业务对象的不同部分定义不同的验证场景(例如,在业务逻辑的某些部分,每个人必须拥有配偶,但拥有配偶并不是固有属性)每个人无处不在)
  • 将验证与表示逻辑(您的视图的代码隐藏)解耦;通过这种方式,您不必强制将您的演示文稿行为与业务对象验证结合起来
  • 验证代码被隔离,并且其每个部分仅针对特定类型的验证;通过这种方式,验证码可以在任何适用的应用程序中重复使用

执行验证的实际代码通常位于单独的验证类中;您的视图模型只会规定每条验证应该如何应用于每条数据。

+2

我会对此建议,ViewModel的目的是为视图的适配器,以便它可以附加到模型。也就是说,在WinForms中,你通常没有ViewModel。 ViewModel尽管名称是* view *的一部分,而不是模型。因此我会避免将验证逻辑放在那里。 – vidstige

+0

有趣的问题!这确实很容易在模型中处理。也许超出了这个评论领域的范围,但是例如这个政策可以被注入到ViewModel中。这样你有一个ViewModel,因为你有一个窗体,ViewModel有两个*模型。 – vidstige

0

业务对象。原因是你希望你的验证规则是可测试的。如果规则很重要,你会想要用测试覆盖它们,如果它们不是的话 - 不要首先实现它们。将这种极端情况提供给代码,其中代码隐藏非常薄,并且几乎没有任何逻辑。这是需要的东西。

相关问题