β‘οΈ Feature-rich, simple, fast and memory efficient input field HotChocolate
+ FluentValidation
integration β‘οΈ
$> dotnet add package AppAny.HotChocolate.FluentValidation
π© You don't pay for validation middleware if the field has no validatable inputs
π© You are not validating, and even trying to validate empty or not marked as validatable inputs
π© Most of extensibility points are just composable delegates
π© Fine-tuning of validation for each field: conditional validation skipping, multiple validators or error mappers per input
π© Strongly typed ValidationStrategy<T>
support
π© First-class attribute-based approach support
β Add FluentValidation validator
public class ExampleInput
{
public string Example { get; set; }
}
public class ExampleInputValidator : AbstractValidator<ExampleInput>
{
public ExampleInputValidator()
{
RuleFor(input => input.Example)
.NotEmpty()
.WithMessage("Example is empty");
}
}
β Configure HotChocolate + FluentValidation integration
services.AddGraphQLServer()
.AddFluentValidation();
descriptor.Field(x => x.Example(default!))
// Explicit over implicit preferred
// You have to add .UseFluentValidation()/attribute to all arguments requiring validation
.Argument("input", argument => argument.UseFluentValidation());
... Example([UseFluentValidation] ExampleInput input) { ... }
β Extend and customize
services.AddGraphQLServer()
.AddFluentValidation(options =>
{
options.SkipValidation(...)
.UseErrorMapper(...)
.UseInputValidators(...);
});
descriptor.Field(x => x.Example(default!))
.Argument("input", argument => argument.UseFluentValidation(options =>
{
options.SkipValidation(...)
.UseErrorMapper(...)
.UseInputValidators(...)
.UseValidator<ExampleInputValidator>()
.UseValidator<ExampleInput, ExampleInputValidator>()
.UseValidator<ExampleInput, ExampleInputValidator>(strategy =>
{
strategy.IncludeProperties(input => input.ExampleProperty);
// ...
});
}));
... Example([UseFluentValidation, UseValidator((typeof(ExampleInputValidator))] ExampleInput input) { ... }
- π Abstractions
- π Defaults
- π Examples
- π Error mappers
- π Validation strategies
- π Input validators
- π Root validator segregation
- π Argument level overrides
- π Attribute-based approach