1

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

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

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

有人可以建议吗?

谢谢布伦丹

4

2 回答 2

2

VAB体验

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

验证数字唯一标识符

您使用范围验证器走在正确的轨道上。请注意,每个范围(上限和下限)都可以有 3 种不同的类型:Inclusive、Exclusive 和 Ignore。这应该涵盖大多数情况。在您的情况下,您可以将上限指定为忽略,下限指定为 1(含 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 层访问的数据库或外部服务)。因此,您最终可能会使用两种不同的实现来显示验证/错误消息。

于 2009-12-07T02:25:04.707 回答
0

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

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

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

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

于 2009-12-06T14:57:11.330 回答