Class FluentValidationServiceCollectionExtensions
- Namespace
- Trellis.Mediator.FluentValidation
- Assembly
- Trellis.Mediator.FluentValidation.dll
Extension methods for plugging FluentValidation into the Trellis Mediator validation stage.
public static class FluentValidationServiceCollectionExtensions
- Inheritance
-
FluentValidationServiceCollectionExtensions
- Inherited Members
Methods
AddTrellisFluentValidation(IServiceCollection)
Registers FluentValidationMessageValidatorAdapter<TMessage> as the open-generic IMessageValidator<TMessage> implementation. Every FluentValidation.IValidator<T> registered for the message in DI will then run inside the existing ValidationBehavior<TMessage, TResponse> and contribute its failures to the aggregated Error.InvalidInput response.
public static IServiceCollection AddTrellisFluentValidation(this IServiceCollection services)
Parameters
servicesIServiceCollectionThe service collection.
Returns
- IServiceCollection
The service collection for chaining.
Examples
services.AddTrellisBehaviors();
services.AddTrellisFluentValidation();
services.AddScoped<IValidator<CreateOrderCommand>, CreateOrderCommandValidator>();
services.AddTrellisUnitOfWork<AppDbContext>();
Remarks
This overload is AOT-friendly: it relies on .NET's open-generic DI registration to
construct closed adapter types at runtime, with no reflection over assemblies. Validators
must be registered explicitly (e.g.,
services.AddScoped<IValidator<CreateOrderCommand>, CreateOrderCommandValidator>()).
FluentValidation does not introduce an additional pipeline behavior; it extends the existing ValidationBehavior<TMessage, TResponse> via the IMessageValidator<TMessage> abstraction.
AddTrellisFluentValidation(IServiceCollection, params Assembly[])
Registers the FluentValidation adapter and scans the supplied assemblies for concrete FluentValidation.IValidator<T> implementations, registering each one as a scoped service.
[RequiresUnreferencedCode("Assembly scanning requires unreferenced types. Use the parameterless overload with explicit registration for AOT/trimming scenarios.")]
[RequiresDynamicCode("Constructs closed generic IValidator<T> service types at runtime. Use the parameterless overload for AOT scenarios.")]
public static IServiceCollection AddTrellisFluentValidation(this IServiceCollection services, params Assembly[] assemblies)
Parameters
servicesIServiceCollectionThe service collection.
assembliesAssembly[]The assemblies to scan for validator implementations.
Returns
- IServiceCollection
The service collection for chaining.
Examples
services.AddTrellisFluentValidation(typeof(CreateOrderCommandValidator).Assembly);
Remarks
Uses reflection over GetTypes() and constructs closed FluentValidation.IValidator<T> service types at runtime, so this overload is not AOT or trimming compatible. For AOT scenarios, call the parameterless overload and register validators explicitly.
If GetTypes() throws ReflectionTypeLoadException,
scanning continues with loadable types and emits a warning through any singleton
ILoggerFactory instance already registered in services.