DataAnnotations-based validation extension for WorkflowForge providing validation capabilities for workflow operations, inputs, and data flow.
$ dotnet add package WorkflowForge.Extensions.Validation
Validation extension for WorkflowForge with DataAnnotations-based validation for comprehensive input validation.
This extension uses System.ComponentModel.DataAnnotations, so you get validation without additional third-party validation libraries.
dotnet add package WorkflowForge.Extensions.Validation
Requires: .NET Standard 2.0 or later
using WorkflowForge.Extensions.Validation;
using System.ComponentModel.DataAnnotations;
// Define validator
public class Order : IValidatableObject
{
[Required(ErrorMessage = "Customer ID required")]
public string CustomerId { get; set; } = string.Empty;
[Range(0.01, double.MaxValue, ErrorMessage = "Amount must be positive")]
public decimal Amount { get; set; }
[MinLength(1, ErrorMessage = "Order must have items")]
public string[] Items { get; set; } = Array.Empty<string>();
public IEnumerable<System.ComponentModel.DataAnnotations.ValidationResult> Validate(ValidationContext context)
{
if (!CustomerId.StartsWith("CUST-"))
yield return new System.ComponentModel.DataAnnotations.ValidationResult(
"Customer ID must start with 'CUST-'",
new[] { nameof(CustomerId) });
}
}
// Configure validation
using var foundry = WorkflowForge.CreateFoundry("ValidatedWorkflow");
foundry.SetProperty("Order", order);
foundry.UseValidation(f => f.GetPropertyOrDefault<Order>("Order"));
// Validation runs before every operation
await smith.ForgeAsync(workflow, foundry);
{
"WorkflowForge": {
"Extensions": {
"Validation": {
"Enabled": true,
"ThrowOnValidationError": true,
"LogValidationErrors": true,
"StoreValidationResults": true,
"IgnoreValidationFailures": false
}
}
}
}
using WorkflowForge.Extensions.Validation.Options;
var options = new ValidationMiddlewareOptions
{
Enabled = true,
ThrowOnValidationError = true,
LogValidationErrors = true,
StoreValidationResults = true
};
foundry.UseValidation(f => f.GetPropertyOrDefault<Order>("Order"), options);
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using WorkflowForge.Extensions.Validation;
services.AddValidationConfiguration(configuration);
var options = serviceProvider.GetRequiredService<IOptions<ValidationMiddlewareOptions>>().Value;
See Configuration Guide for complete options.
public class Order : IValidatableObject
{
[Required]
public string CustomerId { get; set; } = string.Empty;
[Range(0.01, 10000)]
public decimal Amount { get; set; }
[EmailAddress]
public string? Email { get; set; }
public IEnumerable<System.ComponentModel.DataAnnotations.ValidationResult> Validate(ValidationContext context)
{
if (CustomerId.Length < 5)
yield return new System.ComponentModel.DataAnnotations.ValidationResult(
"Customer ID must be at least 5 characters",
new[] { nameof(CustomerId) });
}
}
foundry.UseValidation(
f => f.GetPropertyOrDefault<Order>("Order"),
new ValidationMiddlewareOptions { ThrowOnValidationError = false });