验证应用程序块问题

时间:2009-12-06 14:50:31

标签: .net validation enterprise-library validation-application-bl

有没有人使用过企业库的验证应用程序块?有没有成功?

无论如何,我的问题是关于验证数字唯一标识符。假设我有一个Product类,其ProductId属性表示产品的唯一标识符。这是数字。此标识符不能小于1,它必须大于1.我没有使用验证应用程序块选择哪种验证类型。我正在考虑尝试范围类型,但它需要2个值,一个较低值和一个较高值。

验证业务对象属性的另一个问题。这是测试业务对象的最佳方法吗?我想只指定一次验证规则,然后我想在不同的层中使用它们,比如ASP.NET。我从未以这种方式验证业务对象,只是在客户端。有人可以告诉我最佳路线是什么,以及我是否朝着正确的方向前进?

有人可以提供建议吗?

由于 布伦丹

2 个答案:

答案 0 :(得分:2)

VAB体验

我已将VAB用于项目验证。我会说这很好。我不会说它太棒了。到目前为止没有重大问题。我找到的是我们确实需要创建一些自定义验证器,因为我们的需求没有开箱即用。所以它是可扩展的,这是好的。我们确实遇到了配置工具无法解决我们的类型的问题(我认为这是加载依赖项的一个错误)。代码运行正常,但我们必须在没有工具的情况下进行一些配置。

验证数字唯一标识符

您使用范围验证器走在正确的轨道上。请注意,每个范围(上限和下限)可以有3种不同的类型:包含,独占和忽略。这应该涵盖大多数情况。在您的情况下,您可以将上限指定为ignore,下限为1(假设您希望ProductId为1或更大)。

在配置中,这将是:

   <properties>
      <property name="ProductId">
        <validator lowerBound="1" lowerBoundType="Inclusive" upperBound="0"
          upperBoundType="Ignore" negated="false" messageTemplate="Oops...too low." messageTemplateResourceName=""
          messageTemplateResourceType="" tag="" type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.RangeValidator, Microsoft.Practices.EnterpriseLibrary.Validation, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
          name="Range Validator" />
      </property>
    </properties>

验证业务对象属性

听起来你走在正确的轨道上。您绝对应该始终验证您的业务(或服务)层的输入。如果您还想在客户端层中执行验证,那么您可以跨层共享您的配置或业务对象(业务对象就是您所称的),但您必须确保在层之间同步一个或多个实体。如果要在两个不同的层中进行验证,另一件需要考虑的事情是如何显示ValidationResults。 VAB与ASP.NET集成,但是一旦调用业务层,就不会有这种集成,因此您需要另一种(自定义)方式来显示这些错误。 (这可能就像将标签转储到标签一样简单。)

现在你说:啊,但是如果我在Web层验证,那么我应该捕获ASP.NET中的所有验证错误,它们都可以很好地协同工作。真正。但这让我想到了最后一点。

VAB 可能能够处理所有验证,但它可能无法处理复杂的验证。如果您有交叉字段(或跨对象)验证,则VAB不会很好。此外,您可能需要在业务层中进行一些您不希望在Web层中执行的自定义验证(例如,某些验证可能取决于无法从Web层访问的数据库或外部服务)。因此,您最终可能会有两种不同的实现来显示验证/错误消息。

答案 1 :(得分:0)

为什么不设置验证器的上限等于你正在使用的任何类型的最大值?

例如,如果您使用Int32,请执行以下操作:

[RangeValidator(1, RangeBoundaryType.Inclusive, 
Int32.MaxValue, RangeBoundaryType.Inclusive)]

至于最佳实践,集中验证始终是一项棘手的工作,企业库块是解决此问题的非常好的解决方案。我认为这种方法很好,但它有其局限性(所有尝试解决这个问题的方法都是如此)。