diff --git a/FluentValidation.AutoValidation.Endpoints/FluentValidation.AutoValidation.Endpoints.csproj b/FluentValidation.AutoValidation.Endpoints/FluentValidation.AutoValidation.Endpoints.csproj index 5019ec4..15b160f 100644 --- a/FluentValidation.AutoValidation.Endpoints/FluentValidation.AutoValidation.Endpoints.csproj +++ b/FluentValidation.AutoValidation.Endpoints/FluentValidation.AutoValidation.Endpoints.csproj @@ -11,6 +11,7 @@ SharpGrip FluentValidation AutoValidation Endpoints SharpGrip FluentValidation AutoValidation Endpoints is an extension of the FluentValidation library enabling automatic asynchronous validation in minimal APIs (endpoints). sharpgrip;validation;fluent-validation;endpoints;minimal-api + true diff --git a/FluentValidation.AutoValidation.Endpoints/src/Configuration/AutoValidationEndpointsConfiguration.cs b/FluentValidation.AutoValidation.Endpoints/src/Configuration/AutoValidationEndpointsConfiguration.cs index 4e82152..b3593c9 100644 --- a/FluentValidation.AutoValidation.Endpoints/src/Configuration/AutoValidationEndpointsConfiguration.cs +++ b/FluentValidation.AutoValidation.Endpoints/src/Configuration/AutoValidationEndpointsConfiguration.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics.CodeAnalysis; using Microsoft.AspNetCore.Http.HttpResults; using SharpGrip.FluentValidation.AutoValidation.Endpoints.Results; @@ -9,6 +10,7 @@ public class AutoValidationEndpointsConfiguration /// /// Holds the overridden result factory. This property is meant for infrastructure and should not be used by application code. /// + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] public Type? OverriddenResultFactory { get; private set; } /// @@ -17,7 +19,7 @@ public class AutoValidationEndpointsConfiguration /// /// /// The custom result factory implementing . - public void OverrideDefaultResultFactoryWith() where TResultFactory : IFluentValidationAutoValidationResultFactory + public void OverrideDefaultResultFactoryWith<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TResultFactory>() where TResultFactory : IFluentValidationAutoValidationResultFactory { OverriddenResultFactory = typeof(TResultFactory); } diff --git a/FluentValidation.AutoValidation.Endpoints/src/Extensions/EndpointRouteExtensions.cs b/FluentValidation.AutoValidation.Endpoints/src/Extensions/EndpointRouteExtensions.cs index e6f6fbf..4b4de98 100644 --- a/FluentValidation.AutoValidation.Endpoints/src/Extensions/EndpointRouteExtensions.cs +++ b/FluentValidation.AutoValidation.Endpoints/src/Extensions/EndpointRouteExtensions.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNetCore.Builder; +using System.Diagnostics.CodeAnalysis; +using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; using SharpGrip.FluentValidation.AutoValidation.Endpoints.Filters; @@ -12,6 +13,11 @@ public static class EndpointRouteExtensions /// /// The route handler builder. /// The route handler builder. + /// + /// For AOT validation to work, the validator itself must be marked [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(YourValidator!)] to ensure it's preserved.
+ /// Otherwise, it will not be found at runtime and the validation will NOT happen.
+ ///
+ [RequiresUnreferencedCode("Requires unreferenced code to locate and access IValidator<> types at runtime, it only works for types that are known (and preserved) at compile time. See remarks for more details.")] public static RouteHandlerBuilder AddFluentValidationAutoValidation(this RouteHandlerBuilder routeHandlerBuilder) { routeHandlerBuilder.AddEndpointFilter(); @@ -24,6 +30,11 @@ public static RouteHandlerBuilder AddFluentValidationAutoValidation(this RouteHa /// /// The route group builder. /// The route group builder. + /// + /// For AOT validation to work, the validator itself must be marked as DynamicDependency to ensure it's preserved:[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(YourValidator!)]
+ /// Otherwise, it will not be found at runtime and the validation will NOT happen.
+ ///
+ [RequiresUnreferencedCode("Requires unreferenced code to locate and access IValidator<> types at runtime, it only works for types that are known (and preserved) at compile time. See remarks for more details.")] public static RouteGroupBuilder AddFluentValidationAutoValidation(this RouteGroupBuilder routeGroupBuilder) { routeGroupBuilder.AddEndpointFilter(); diff --git a/FluentValidation.AutoValidation.Shared/FluentValidation.AutoValidation.Shared.csproj b/FluentValidation.AutoValidation.Shared/FluentValidation.AutoValidation.Shared.csproj index eed5b58..0a3a3c0 100644 --- a/FluentValidation.AutoValidation.Shared/FluentValidation.AutoValidation.Shared.csproj +++ b/FluentValidation.AutoValidation.Shared/FluentValidation.AutoValidation.Shared.csproj @@ -11,6 +11,7 @@ SharpGrip FluentValidation AutoValidation Shared SharpGrip FluentValidation AutoValidation is an extension of the FluentValidation library enabling automatic asynchronous validation in MVC controllers and minimal APIs (endpoints). sharpgrip;validation;fluent-validation;mvc;endpoints;minimal-api + true diff --git a/FluentValidation.AutoValidation.Shared/src/Extensions/ServiceProviderExtensions.cs b/FluentValidation.AutoValidation.Shared/src/Extensions/ServiceProviderExtensions.cs index b15530f..f05d990 100644 --- a/FluentValidation.AutoValidation.Shared/src/Extensions/ServiceProviderExtensions.cs +++ b/FluentValidation.AutoValidation.Shared/src/Extensions/ServiceProviderExtensions.cs @@ -1,10 +1,17 @@ using System; using FluentValidation; +#if NET7_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif namespace SharpGrip.FluentValidation.AutoValidation.Shared.Extensions { public static class ServiceProviderExtensions { +#if NET7_0_OR_GREATER + [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(IValidator<>))] + [UnconditionalSuppressMessage("Aot", "IL3050", Justification = "Validators should be preserved by the compiler if the user has marked them with [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(YourValidator!)] or similar.")] +#endif public static object? GetValidator(this IServiceProvider serviceProvider, Type type) { return serviceProvider.GetService(typeof(IValidator<>).MakeGenericType(type));