From 36f1a9eb1ba5c774526f9e0d1c581e19fae1ac6c Mon Sep 17 00:00:00 2001 From: Louis Seubert Date: Fri, 29 May 2026 23:05:24 +0200 Subject: [PATCH] feat: rename validation builder for parity Rename extensions functions and `IValidatorBuilder` for parity with dispatcher options and builder. --- CHANGELOG.md | 1 + .../DependencyInjectionTests.cs | 18 +++--- .../DispatchingValidator.cs | 2 +- ...Builder.cs => IRequestValidatorBuilder.cs} | 2 +- ...s => RequestValidatorBuilderExtensions.cs} | 62 +++++++++---------- ...nOptions.cs => RequestValidatorOptions.cs} | 4 +- .../ServiceCollectionExtensions.cs | 14 ++--- 7 files changed, 52 insertions(+), 51 deletions(-) rename src/request.validation/{IValidatorBuilder.cs => IRequestValidatorBuilder.cs} (90%) rename src/request.validation/{ValidatorBuilderExtensions.cs => RequestValidatorBuilderExtensions.cs} (59%) rename src/request.validation/{ValidationOptions.cs => RequestValidatorOptions.cs} (97%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47e4306..640e8a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ### Changed - **request.dispatcher:** Hide pipeline internals in stack frames +- **request.validation:** Rename `IValidatorBuilder` to `IRequestValidatorBuilder` incl. extensions methods ### Removed diff --git a/src/request.validation.tests/DependencyInjectionTests.cs b/src/request.validation.tests/DependencyInjectionTests.cs index d3cf625..ae98a7a 100644 --- a/src/request.validation.tests/DependencyInjectionTests.cs +++ b/src/request.validation.tests/DependencyInjectionTests.cs @@ -11,7 +11,7 @@ internal sealed class DependencyInjectionTests public async Task I_can_resolve_single_validator() { var services = new ServiceCollection(); - services.AddValidation(builder => + services.AddRequestValidation(builder => { builder.Add(ServiceLifetime.Transient); }); @@ -27,7 +27,7 @@ internal sealed class DependencyInjectionTests public async Task I_can_resolve_multiple_validators() { var services = new ServiceCollection(); - services.AddValidation(builder => + services.AddRequestValidation(builder => { builder.Add(ServiceLifetime.Transient); builder.Add(ServiceLifetime.Transient); @@ -46,7 +46,7 @@ internal sealed class DependencyInjectionTests public async Task I_can_resolve_open_generic_validator() { var services = new ServiceCollection(); - services.AddValidation(builder => + services.AddRequestValidation(builder => { builder.Add(typeof(GenericValidator<>), ServiceLifetime.Transient); }); @@ -63,7 +63,7 @@ internal sealed class DependencyInjectionTests public async Task I_can_resolve_multi_interface_validator() { var services = new ServiceCollection(); - services.AddValidation(builder => + services.AddRequestValidation(builder => { builder.Add(ServiceLifetime.Transient); }); @@ -84,7 +84,7 @@ internal sealed class DependencyInjectionTests public async Task I_can_resolve_generic_validator_with_constraints() { var services = new ServiceCollection(); - services.AddValidation(builder => + services.AddRequestValidation(builder => { builder.Add(typeof(ConstrainedValidator<>), ServiceLifetime.Transient); }); @@ -104,7 +104,7 @@ internal sealed class DependencyInjectionTests public async Task I_can_resolve_generic_wrapper_validator_with_constraints() { var services = new ServiceCollection(); - services.AddValidation(builder => + services.AddRequestValidation(builder => { builder.Add(typeof(ConstrainedWrapperValidator<>), ServiceLifetime.Transient); }); @@ -124,7 +124,7 @@ internal sealed class DependencyInjectionTests public async Task I_can_resolve_aggregate_validator_directly() { var services = new ServiceCollection(); - services.AddValidation(builder => + services.AddRequestValidation(builder => { builder.Add(ServiceLifetime.Transient); builder.Add(ServiceLifetime.Transient); @@ -142,7 +142,7 @@ internal sealed class DependencyInjectionTests public async Task I_can_select_validators_from_base_classes_and_interfaces() { var services = new ServiceCollection(); - services.AddValidation(builder => + services.AddRequestValidation(builder => { builder.Add(ServiceLifetime.Transient); builder.Add(ServiceLifetime.Transient); @@ -161,7 +161,7 @@ internal sealed class DependencyInjectionTests public async Task I_can_select_validators_polymorphically_based_on_the_instance_type() { var services = new ServiceCollection(); - services.AddValidation(builder => + services.AddRequestValidation(builder => { builder.Add(ServiceLifetime.Transient); builder.Add(ServiceLifetime.Transient); diff --git a/src/request.validation/DispatchingValidator.cs b/src/request.validation/DispatchingValidator.cs index 4fe7bff..2bd17e6 100644 --- a/src/request.validation/DispatchingValidator.cs +++ b/src/request.validation/DispatchingValidator.cs @@ -54,7 +54,7 @@ internal sealed class DispatchingValidator : IValidator { public override Validation Validate(ValidationContext context, IServiceProvider serviceProvider) { - var options = serviceProvider.GetRequiredService>().Value; + var options = serviceProvider.GetRequiredService>().Value; var validators = options.GetValidators(serviceProvider); diff --git a/src/request.validation/IValidatorBuilder.cs b/src/request.validation/IRequestValidatorBuilder.cs similarity index 90% rename from src/request.validation/IValidatorBuilder.cs rename to src/request.validation/IRequestValidatorBuilder.cs index 17d01ca..f699fbc 100644 --- a/src/request.validation/IValidatorBuilder.cs +++ b/src/request.validation/IRequestValidatorBuilder.cs @@ -8,7 +8,7 @@ namespace Geekeey.Request.Validation; /// /// Defines a builder for configuring validator registrations. /// -public interface IValidatorBuilder +public interface IRequestValidatorBuilder { /// /// Gets the service collection where the validators are registered. diff --git a/src/request.validation/ValidatorBuilderExtensions.cs b/src/request.validation/RequestValidatorBuilderExtensions.cs similarity index 59% rename from src/request.validation/ValidatorBuilderExtensions.cs rename to src/request.validation/RequestValidatorBuilderExtensions.cs index b71c728..054da7c 100644 --- a/src/request.validation/ValidatorBuilderExtensions.cs +++ b/src/request.validation/RequestValidatorBuilderExtensions.cs @@ -6,24 +6,24 @@ using System.Reflection; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; -using static Geekeey.Request.Validation.ValidationOptions; +using static Geekeey.Request.Validation.RequestValidatorOptions; namespace Geekeey.Request.Validation; /// -/// Provides extension methods for configuring +/// Provides extension methods for configuring /// with additional capabilities such as searching and registering validators in assemblies or adding types directly. /// -public static class ValidatorBuilderExtensions +public static class RequestValidatorBuilderExtensions { /// /// Searches for validator types within the specified assembly and adds them to the validator /// configuration. /// - /// The to configure. + /// The to configure. /// The assembly to search for validator types. - /// The instance for further configuration. - public static IValidatorBuilder SearchInAssembly(this IValidatorBuilder builder, Assembly assembly) + /// The instance for further configuration. + public static IRequestValidatorBuilder SearchInAssembly(this IRequestValidatorBuilder builder, Assembly assembly) { ArgumentNullException.ThrowIfNull(builder); @@ -40,11 +40,11 @@ public static class ValidatorBuilderExtensions /// Searches for validator types within the specified assembly and adds them to the validator /// configuration with the given service lifetime. /// - /// The to configure. + /// The to configure. /// The assembly to search for validator types. /// The lifetime with which the validators are registered in the dependency injection container. - /// The instance for further configuration. - public static IValidatorBuilder SearchInAssembly(this IValidatorBuilder builder, Assembly assembly, ServiceLifetime lifetime) + /// The instance for further configuration. + public static IRequestValidatorBuilder SearchInAssembly(this IRequestValidatorBuilder builder, Assembly assembly, ServiceLifetime lifetime) { ArgumentNullException.ThrowIfNull(builder); @@ -60,14 +60,14 @@ public static class ValidatorBuilderExtensions /// /// Adds the specified type to the validator configuration for inspection. /// - /// The to configure. + /// The to configure. /// The type to be added to the validator configuration. - /// The instance for further configuration. - public static IValidatorBuilder Add(this IValidatorBuilder builder, Type type) + /// The instance for further configuration. + public static IRequestValidatorBuilder Add(this IRequestValidatorBuilder builder, Type type) { ArgumentNullException.ThrowIfNull(builder); - builder.Services.AddOptions() + builder.Services.AddOptions() .Configure(options => options.Inspect([type])); return builder; @@ -78,15 +78,15 @@ public static class ValidatorBuilderExtensions /// This also adds the type to the service collection with the specified lifetime, /// allowing it to be resolved as a dependency. /// - /// The used to configure the validators. + /// The used to configure the validators. /// The type to be added to the validator configuration. /// The lifetime scope of the type in the service container. - /// The instance for further configuration. - public static IValidatorBuilder Add(this IValidatorBuilder builder, Type type, ServiceLifetime lifetime) + /// The instance for further configuration. + public static IRequestValidatorBuilder Add(this IRequestValidatorBuilder builder, Type type, ServiceLifetime lifetime) { ArgumentNullException.ThrowIfNull(builder); - builder.Services.AddOptions() + builder.Services.AddOptions() .Configure(options => options.Inspect([type])); builder.Services.Add(new ServiceDescriptor(type, type, lifetime)); @@ -97,16 +97,16 @@ public static class ValidatorBuilderExtensions /// /// Adds the specified collection of types to the validator configuration for inspection. /// - /// The to configure. + /// The to configure. /// The collection of types to be added to the validator configuration. - /// The instance for further configuration. - public static IValidatorBuilder Add(this IValidatorBuilder builder, IEnumerable types) + /// The instance for further configuration. + public static IRequestValidatorBuilder Add(this IRequestValidatorBuilder builder, IEnumerable types) { ArgumentNullException.ThrowIfNull(builder); var typeList = types.ToList(); - builder.Services.AddOptions() + builder.Services.AddOptions() .Configure(options => options.Inspect(typeList)); return builder; @@ -117,17 +117,17 @@ public static class ValidatorBuilderExtensions /// This also adds the specified collection of types to the service collection with the specified lifetime, /// allowing it to be resolved as a dependency. /// - /// The to configure. + /// The to configure. /// The collection of types to be added to the validator configuration. /// The lifetime scope of the types in the service container. - /// The instance for further configuration. - public static IValidatorBuilder Add(this IValidatorBuilder builder, IEnumerable types, ServiceLifetime lifetime) + /// The instance for further configuration. + public static IRequestValidatorBuilder Add(this IRequestValidatorBuilder builder, IEnumerable types, ServiceLifetime lifetime) { ArgumentNullException.ThrowIfNull(builder); var typeList = types.ToList(); - builder.Services.AddOptions() + builder.Services.AddOptions() .Configure(options => options.Inspect(typeList)); builder.Services.Add(typeList.Select(export => new ServiceDescriptor(export, export, lifetime))); @@ -139,9 +139,9 @@ public static class ValidatorBuilderExtensions /// Adds the specified validator type to the validator configuration. /// /// The type of the validator to add. - /// The to configure. - /// The instance for further configuration. - public static IValidatorBuilder Add(this IValidatorBuilder builder) + /// The to configure. + /// The instance for further configuration. + public static IRequestValidatorBuilder Add(this IRequestValidatorBuilder builder) where TValidator : class, IValidator { return builder.Add(typeof(TValidator)); @@ -151,10 +151,10 @@ public static class ValidatorBuilderExtensions /// Adds the specified validator type to the validator configuration with the specified lifetime. /// /// The type of the validator to add. - /// The to configure. + /// The to configure. /// The lifetime scope of the validator in the service container. - /// The instance for further configuration. - public static IValidatorBuilder Add(this IValidatorBuilder builder, ServiceLifetime lifetime) + /// The instance for further configuration. + public static IRequestValidatorBuilder Add(this IRequestValidatorBuilder builder, ServiceLifetime lifetime) where TValidator : class, IValidator { return builder.Add(typeof(TValidator), lifetime); diff --git a/src/request.validation/ValidationOptions.cs b/src/request.validation/RequestValidatorOptions.cs similarity index 97% rename from src/request.validation/ValidationOptions.cs rename to src/request.validation/RequestValidatorOptions.cs index b541e86..d7c5d75 100644 --- a/src/request.validation/ValidationOptions.cs +++ b/src/request.validation/RequestValidatorOptions.cs @@ -8,12 +8,12 @@ using Microsoft.Extensions.DependencyInjection; namespace Geekeey.Request.Validation; -internal sealed class ValidationOptions +internal sealed class RequestValidatorOptions { private readonly List _search = []; private readonly Lazy _validatorsTypeIndex; - public ValidationOptions() + public RequestValidatorOptions() { _validatorsTypeIndex = new Lazy(() => new ValidatorTypeIndex(_search.Distinct())); } diff --git a/src/request.validation/ServiceCollectionExtensions.cs b/src/request.validation/ServiceCollectionExtensions.cs index 8574f4f..52b47bf 100644 --- a/src/request.validation/ServiceCollectionExtensions.cs +++ b/src/request.validation/ServiceCollectionExtensions.cs @@ -14,15 +14,15 @@ public static class ServiceCollectionExtensions /// Adds validator services to the specified . /// /// The service collection to which the validator services will be added. - /// An instance of to configure the validator registrations. - public static IValidatorBuilder AddValidation(this IServiceCollection services) + /// An instance of to configure the validator registrations. + public static IRequestValidatorBuilder AddRequestValidation(this IServiceCollection services) { ArgumentNullException.ThrowIfNull(services); - services.AddOptions(); + services.AddOptions(); services.AddTransient(); - return new ValidatorBuilder(services); + return new RequestValidatorBuilder(services); } /// @@ -32,17 +32,17 @@ public static class ServiceCollectionExtensions /// The service collection to which the validator services will be added. /// A delegate to configure the validator builder. /// The service collection with the validator services added. - public static IServiceCollection AddValidation(this IServiceCollection services, Action configure) + public static IServiceCollection AddRequestValidation(this IServiceCollection services, Action configure) { ArgumentNullException.ThrowIfNull(services); ArgumentNullException.ThrowIfNull(configure); - configure(services.AddValidation()); + configure(services.AddRequestValidation()); return services; } - private sealed class ValidatorBuilder(IServiceCollection services) : IValidatorBuilder + private sealed class RequestValidatorBuilder(IServiceCollection services) : IRequestValidatorBuilder { public IServiceCollection Services { get; } = services; }