执行Business对象的验证。包含的对象怎么样?

时间:2011-03-23 16:53:38

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

我是Enterprise Library的新手。我正在尝试验证JuvenileClientContactItem类型的业务对象。

JuvenileClientContactItem个对象本身包含对象,在本例中是两个AddressType类型对象的实例。

当我执行以下调用以验证JuvenileClientContactItem时,我预计所有包含的对象也将被验证,并且PersonType对象中遇到的任何错误都将添加到ValidationResults集合,但只执行了JuvenileClientContactItem对象的验证。

validationResults = validationService
    .Validate(Of JuvenileClientContactItem) _
    (juvenileClientContactItem, _
    "JuvenileClientContactItemRuleSet", "PersonTypeRuleSet")

以下是企业库验证功能的签名:

Public Shared Function Validate(Of T)(ByVal target As T, _
    ByVal ParamArray rulesets() As String) _
    As Microsoft.Practices.EnterpriseLibrary.Validation.ValidationResults

要验证Address对象中的两个JuvenileClientContactItem子对象,我需要对Validate方法执行单独调用,例如:

residentaddressValidationResults = validationService
    .Validate(Of BusinessObjects.AddressType) _
    (juvenileClientContactItem.ResidenceAddress, _
    Me.View, "AddressTypeRuleSet")

我很想编写自己的通用验证方法,该方法使用反射来检查为验证而传递的对象,查找支持自我验证的包含对象并执行调用并将所有验证的结果聚合到单个返回的集合中。有更好的方法吗?

编辑:

根据下面提到的建议,我添加了以下代码:

<System.Serializable()> _
<DataContract()> _
<HasSelfValidation()> _
<ObjectValidator()> _
Public Class AddressType

...并且得到了ObjectValidatorAttribute无法应用的错误,因为该属性在此声明类型上无效。

为什么呢?我该如何纠正?

1 个答案:

答案 0 :(得分:1)

您应该使用TheJuvenileClientContactItem修饰ObjectValidatorAttribute类型的属性,因为默认情况下验证应用程序块不会验证对象图(以防止出现性能问题和堆栈溢出异常)。