A few days a go i was going through my bookmarks, and came accross this post on the GetPaint.Net blog about using a fluent interface for parameter validation.
After reading the article, I tried the code out at home, and was very impressed. Not only does it read well, but also does not create any objects untill a piece of validation fails. Very nice.
However i wanted to use this at work, and this presented me with a problem. Work only has VS2005, which means no extension methods, which are the crux of how this validation method works.
I spent a while trying to see if it was possible to keep the fluent interface and not instantiate any objects until something fails. In the end i settled for this method which only creates one object.
Public Class Validate
Public Shared Function Begin() As ValidationExpression
Return New ValidationExpression
End Function
Public Class ValidationExpression
Private _validation As Validation = Nothing
Friend Sub New()
End Sub
Public Function IsNotNull(Of T)(ByVal obj As T, ByVal name As String) As ValidationExpression
If obj Is Nothing Then
Init()
_validation.AddException(New ArgumentNullException(name))
End If
Return Me
End Function
Public Function IsPositive(ByVal value As Integer, ByVal name As String) As ValidationExpression
If value < 0 Then
Init()
_validation.AddException(New ArgumentOutOfRangeException(name, "must be positive, but was " & value.ToString))
End If
Return Me
End Function
Public Function Check() As ValidationExpression
If _validation Is Nothing Then
Return Me
End If
If _validation.Exceptions.count = 1 Then
Throw New ValidationException(_validation.Exceptions(0))
Else
Throw New ValidationException(New MultiException(_validation.Exceptions))
End If
End Function
Private Sub Init()
If _validation Is Nothing Then
_validation = New Validation
End If
End Sub
End Class
End Class
The rest of the code used is identical to Rick Brewster’s Article, so head over there to see it in all its (well written) glory.