设计思路
- 定义数据模型:创建订单和商品的数据模型类,使用数据注解来标记需要验证的属性。
- 验证器设计:构建一个通用的验证器,利用反射来读取数据注解,并根据注解的规则进行验证。
- 业务逻辑整合:在订单提交的逻辑中调用验证器,确保订单数据的准确性。
关键代码框架
- 定义商品类
Public Class Product
<Required>
Public Property Stock As Integer
<Required>
<Range(0, Double.MaxValue)>
Public Property Price As Double
End Class
- 定义订单类
Public Class Order
<Required>
Public Property Products As List(Of Product)
<Required>
Public Property TotalAmount As Double
End Class
- 数据注解定义
Imports System.ComponentModel.DataAnnotations
<AttributeUsage(AttributeTargets.Property, AllowMultiple := False)>
Public Class RequiredAttribute
Inherits ValidationAttribute
Public Overrides Function IsValid(ByVal value As Object) As Boolean
Return value IsNot Nothing
End Function
End Class
<AttributeUsage(AttributeTargets.Property, AllowMultiple := False)>
Public Class RangeAttribute
Inherits ValidationAttribute
Private _min As Double
Private _max As Double
Public Sub New(ByVal min As Double, ByVal max As Double)
_min = min
_max = max
End Sub
Public Overrides Function IsValid(ByVal value As Object) As Boolean
If value Is Nothing Then Return False
Dim num As Double
If Double.TryParse(value.ToString(), num) Then
Return num >= _min AndAlso num <= _max
End If
Return False
End Function
End Class
- 验证器
Imports System.Reflection
Public Class OrderValidator
Public Shared Function ValidateOrder(ByVal order As Order) As Boolean
Dim isValid As Boolean = True
'验证订单属性
Dim orderProps = GetType(Order).GetProperties()
For Each prop In orderProps
Dim attrs = prop.GetCustomAttributes(GetType(ValidationAttribute), True)
For Each attr In attrs
Dim value = prop.GetValue(order)
If Not CType(attr, ValidationAttribute).IsValid(value) Then
isValid = False
Exit For
End If
Next
If Not isValid Then Exit For
Next
If isValid Then
'验证商品列表
Dim total As Double = 0
For Each product In order.Products
Dim productProps = GetType(Product).GetProperties()
For Each prop In productProps
Dim attrs = prop.GetCustomAttributes(GetType(ValidationAttribute), True)
For Each attr In attrs
Dim value = prop.GetValue(product)
If Not CType(attr, ValidationAttribute).IsValid(value) Then
isValid = False
Exit For
End If
Next
If Not isValid Then Exit For
Next
If isValid Then
total += product.Price * product.Stock
End If
If Not isValid Then Exit For
Next
If isValid Then
isValid = total = order.TotalAmount
End If
End If
Return isValid
End Function
End Class
- 订单提交逻辑
Public Class OrderService
Public Sub SubmitOrder(ByVal order As Order)
If OrderValidator.ValidateOrder(order) Then
'执行订单提交的业务逻辑
Console.WriteLine("订单提交成功")
Else
Console.WriteLine("订单数据验证失败")
End If
End Sub
End Class