Tolitech.FluentValidation.Generators
1.0.0-preview.4
dotnet add package Tolitech.FluentValidation.Generators --version 1.0.0-preview.4
NuGet\Install-Package Tolitech.FluentValidation.Generators -Version 1.0.0-preview.4
<PackageReference Include="Tolitech.FluentValidation.Generators" Version="1.0.0-preview.4" />
<PackageVersion Include="Tolitech.FluentValidation.Generators" Version="1.0.0-preview.4" />
<PackageReference Include="Tolitech.FluentValidation.Generators" />
paket add Tolitech.FluentValidation.Generators --version 1.0.0-preview.4
#r "nuget: Tolitech.FluentValidation.Generators, 1.0.0-preview.4"
#:package Tolitech.FluentValidation.Generators@1.0.0-preview.4
#addin nuget:?package=Tolitech.FluentValidation.Generators&version=1.0.0-preview.4&prerelease
#tool nuget:?package=Tolitech.FluentValidation.Generators&version=1.0.0-preview.4&prerelease
Tolitech.FluentValidation.Generators
Tolitech.FluentValidation.Generators is a C# source generator that automatically discovers and registers all FluentValidation
validators in your project for dependency injection, without requiring manual registration or runtime reflection.
Key Features
- Automatic Discovery: Finds all classes inheriting from
AbstractValidator<T>
at compile time. - Source Generation: Generates an extension method to register all discovered validators in the DI container.
- No Reflection: Eliminates the need for runtime scanning or manual registration.
How It Works
The generator scans your codebase for all non-abstract classes that inherit from FluentValidation.AbstractValidator<T>
. It then generates an extension method AddGeneratedValidators
for IServiceCollection
, which registers each validator as a scoped service for its corresponding type.
Example
Suppose you have the following validator:
using FluentValidation;
public class PersonCommand
{
public string FirstName { get; }
public string LastName { get; }
public PersonCommand(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
}
public class PersonCommandValidator : AbstractValidator<PersonCommand>
{
public PersonCommandValidator()
{
RuleFor(x => x.FirstName).NotEmpty();
RuleFor(x => x.LastName).NotEmpty();
}
}
After building your project, the generator will produce an extension method like:
public static class FluentValidationServiceCollectionExtensions
{
public static IServiceCollection AddGeneratedValidators(this IServiceCollection services)
{
services.AddScoped<IValidator<PersonCommand>, PersonCommandValidator>();
// ...other discovered validators
return services;
}
}
Usage
Reference the Generator: Add a reference to the
Tolitech.FluentValidation.Generators
package in your project.Call the Extension Method: In your application startup, register the generated validators:
using Microsoft.Extensions.DependencyInjection;
var services = new ServiceCollection();
services.AddGeneratedValidators();
- Resolve Validators: Validators are now available via DI:
var provider = services.BuildServiceProvider();
var validator = provider.GetService<IValidator<PersonCommand>>();
Technical Details
- The generator uses Roslyn APIs to analyze the syntax tree and semantic model at compile time.
- Only non-abstract classes directly inheriting from
AbstractValidator<T>
are registered. - The generated code is placed in the
Tolitech.FluentValidation.Generators
namespace. - The extension method is safe to call multiple times and can be combined with other service registrations.
Integration Testing
The project includes integration tests to ensure that validators are correctly registered and resolved, and that validation logic works as expected.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last Updated |
---|---|---|
1.0.0-preview.4 | 244 | 9/18/2025 |
1.0.0-preview.3 | 241 | 9/18/2025 |
1.0.0-preview.2 | 242 | 9/18/2025 |
1.0.0-preview.1 | 244 | 9/17/2025 |