This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
NServiceBus.Community.Validation provides message validation for NServiceBus using two validation libraries:
- NServiceBus.Community.FluentValidation - Uses FluentValidation
- NServiceBus.Community.DataAnnotations - Uses System.ComponentModel.DataAnnotations
Both validate incoming and outgoing messages in the NServiceBus pipeline and add validation exceptions to unrecoverable exceptions to avoid unnecessary retries.
# Build all projects
dotnet build src/NServiceBus.Validation.sln
# Run all tests
dotnet test src/NServiceBus.Validation.sln
# Run tests for a specific project
dotnet test src/NServiceBus.FluentValidation.Tests/NServiceBus.Community.FluentValidation.Tests.csproj
dotnet test src/NServiceBus.DataAnnotations.Tests/NServiceBus.Community.DataAnnotations.Tests.csproj
# Run a single test
dotnet test src/NServiceBus.FluentValidation.Tests --filter "FullyQualifiedName~IncomingTests.With_validator_invalid"Both validation libraries implement NServiceBus pipeline behaviors:
IncomingValidationBehavior- Validates messages being received (wrapsIIncomingLogicalMessageContext)OutgoingValidationBehavior- Validates messages being sent (wrapsIOutgoingLogicalMessageContext)
FluentValidationExtensions- Entry point viaUseFluentValidation()extension method onEndpointConfigurationMessageValidator- Core validation logic that invokes FluentValidation validatorsValidationFinder- Scans assemblies for validator typesEndpointValidatorTypeCache/IValidatorTypeCache- Caches validators per message type- Validators are registered via DI using
AddValidatorsFromAssemblyContaining<T>()
DataAnnotationsConfigurationExtensions- Entry point viaUseDataAnnotationsValidation()extension methodMessageValidator- UsesValidator.TryValidateObject()from System.ComponentModel.DataAnnotations
NServiceBus.FluentValidation.Testing- ProvidesValidatingContextfor unit testing message handlers with validation
- All extension methods live in the
NServiceBusnamespace for discoverability - Both libraries use the same
MessageValidationExceptiontype - Validators can access message headers and
ContextBagvia extension methods onIValidationContext - Central package version management via
Directory.Packages.props
Tests use NUnit with Verify.NServiceBus for snapshot testing of validation exceptions. Tests spin up real NServiceBus endpoints using LearningTransport.