From cb69be5528a20af792dd6904149481bb2921edad Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Mon, 25 May 2026 11:40:22 +1000 Subject: [PATCH] =?UTF-8?q?feat(api):=20=D0=94=D0=BE=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=20=D1=84=D0=B8=D0=BB=D1=8C=D1=82=D1=80?= =?UTF-8?q?=D0=B0=20=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARR.API/Infrastructure/ConfigureValidator.cs | 3 -- .../Filters/AsyncValidationFilter.cs | 34 +++++++++---------- .../PARR.WorkloadBuilderWorker.csproj | 1 - 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/PARR.API/Infrastructure/ConfigureValidator.cs b/PARR.API/Infrastructure/ConfigureValidator.cs index bd38b386..721e9af0 100644 --- a/PARR.API/Infrastructure/ConfigureValidator.cs +++ b/PARR.API/Infrastructure/ConfigureValidator.cs @@ -49,9 +49,6 @@ namespace PARR.API.Infrastructure // Включаем авто-валидацию FluentValidation для контроллеров //services.AddFluentValidationAutoValidation(); - services.AddScoped(); - - return services; } } diff --git a/PARR.API/Infrastructure/Filters/AsyncValidationFilter.cs b/PARR.API/Infrastructure/Filters/AsyncValidationFilter.cs index 93ceccb6..e59b5c72 100644 --- a/PARR.API/Infrastructure/Filters/AsyncValidationFilter.cs +++ b/PARR.API/Infrastructure/Filters/AsyncValidationFilter.cs @@ -1,19 +1,21 @@ using FluentValidation; -using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; -using PARR.API.Contracts.V1.Responses.Base; namespace PARR.API.Infrastructure.Filters { + /// + /// Фильтр для автоматического применения валидации реквестов. + /// public class AsyncValidationFilter : IAsyncActionFilter { - private readonly IServiceProvider _serviceProvider; - - public AsyncValidationFilter(IServiceProvider serviceProvider) - { - _serviceProvider = serviceProvider; - } - + /// + /// Фильтр для автоматического применения валидации реквестов. + /// Выполняется до срабатывания метода в контроллере. + /// + /// + /// + /// + /// public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { foreach (var argument in context.ActionArguments.Values) @@ -21,22 +23,20 @@ namespace PARR.API.Infrastructure.Filters if (argument == null) continue; + // Динамически ищем валидатор в DI для типа текущего аргумента var validatorType = typeof(IValidator<>).MakeGenericType(argument.GetType()); - var validator = _serviceProvider.GetService(validatorType); + var validator = context.HttpContext.RequestServices.GetService(validatorType) as IValidator; if (validator is IValidator validatorInstance) { var validationContext = new ValidationContext(argument); - var validationResult = await validatorInstance.ValidateAsync(validationContext, context.HttpContext.RequestAborted); + + // Запуск асинхронной валидации + var validationResult = await validator.ValidateAsync(validationContext, context.HttpContext.RequestAborted); if (!validationResult.IsValid) { - var errors = validationResult.Errors - .Select(e => new ErrorModel { Message = e.ErrorMessage }) - .ToList(); - - context.Result = new BadRequestObjectResult(new Response(false, errors)); - return; + throw new ValidationException(validationResult.Errors); } } } diff --git a/PARR.WorkloadBuilderWorker/PARR.WorkloadBuilderWorker.csproj b/PARR.WorkloadBuilderWorker/PARR.WorkloadBuilderWorker.csproj index 0f94b6c2..e7db540f 100644 --- a/PARR.WorkloadBuilderWorker/PARR.WorkloadBuilderWorker.csproj +++ b/PARR.WorkloadBuilderWorker/PARR.WorkloadBuilderWorker.csproj @@ -11,7 +11,6 @@ -