FluentValidation extensions and SA-specific validators
$ dotnet add package RepletoryLib.Utilities.ValidationFluentValidation extensions with South African-specific validators for ID numbers, phone numbers, passports, and more.
Part of the RepletoryLib ecosystem -- standalone, reusable .NET 10 libraries with zero business logic.
RepletoryLib.Utilities.Validation extends FluentValidation with reusable rule builder extensions for common and South African-specific validation scenarios. It includes validators for SA ID numbers (with Luhn checksum and demographic extraction), phone numbers, passports, company registration numbers, and VAT numbers.
AbstractValidator<T> implementationsdotnet add package RepletoryLib.Utilities.Validation
| Package | Type |
|---|---|
RepletoryLib.Common | RepletoryLib |
FluentValidation | NuGet (11.11.0) |
FluentValidation.DependencyInjectionExtensions | NuGet (11.11.0) |
using RepletoryLib.Utilities.Validation;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRepletoryValidation(typeof(Program).Assembly);
using FluentValidation;
using RepletoryLib.Utilities.Validation;
public class CustomerValidator : AbstractValidator<Customer>
{
public CustomerValidator()
{
RuleFor(x => x.Email).ValidEmail();
RuleFor(x => x.Phone).ValidSaPhone();
RuleFor(x => x.IdNumber).ValidSaIdNumber();
RuleFor(x => x.Website).ValidUrl();
RuleFor(x => x.Password).StrongPassword();
RuleFor(x => x.Income).ValidZarAmount();
RuleFor(x => x.DateOfBirth).ValidPastDate();
RuleFor(x => x.AppointmentDate).ValidFutureDate();
}
}
public class CompanyValidator : AbstractValidator<Company>
{
public CompanyValidator()
{
RuleFor(x => x.RegistrationNumber).ValidSaCompanyReg();
RuleFor(x => x.PassportNumber).ValidSaPassport();
RuleFor(x => x.ReferenceId).ValidGuid();
RuleFor(x => x.EncodedData).ValidBase64();
}
}
using RepletoryLib.Utilities.Validation;
var result = SaIdNumberValidator.Validate("9501015800087");
if (result.IsValid)
{
Console.WriteLine(result.DateOfBirth); // 1995-01-01
Console.WriteLine(result.Gender); // "Male"
Console.WriteLine(result.CitizenshipStatus); // "SA Citizen"
}
else
{
Console.WriteLine(result.ErrorMessage); // Describes the validation failure
}
| Extension | Applies To | Description |
|---|---|---|
.ValidEmail() | string | Valid email format |
.ValidUrl() | string | Valid absolute HTTP/HTTPS URL |
.ValidPhone() | string | Generic phone format |
.ValidSaPhone() | string | SA phone (E.164, +27, or 0-prefix) |
.ValidSaIdNumber() | string | 13-digit SA ID with Luhn checksum |
.ValidSaPassport() | string | SA passport number format |
.ValidSaCompanyReg() | string | SA company registration number |
.StrongPassword() | string | Min 8 chars, upper, lower, digit, special |
.ValidZarAmount() | decimal | Positive value, max 2 decimal places |
.ValidFutureDate() | DateTime | Date must be in the future |
.ValidPastDate() | DateTime | Date must be in the past |
.ValidGuid() | string | Valid GUID format |
.ValidBase64() | string | Valid Base64 string |
| Package | Relationship |
|---|---|
RepletoryLib.Common | Direct dependency |
RepletoryLib.Data.Interceptors | [ValidateSaIdNumber], [ValidateSaPhone], [ValidateEmail] attributes use similar logic |
RepletoryLib.Utilities.Formatting | Format validated values for display |
This project is licensed under the MIT License.
Copyright (c) 2024-2026 Repletory.
For complete documentation, infrastructure setup, and configuration reference, see the RepletoryLib main repository.