37 lines
1.1 KiB
C#
37 lines
1.1 KiB
C#
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
using System.Threading;
|
|||
|
using System.Threading.Tasks;
|
|||
|
using FluentValidation;
|
|||
|
using MediatR;
|
|||
|
|
|||
|
namespace CQRS_Simple.API.PipelineBehaviors
|
|||
|
{
|
|||
|
public class ValidationBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
|
|||
|
where TRequest : IRequest<TResponse>
|
|||
|
{
|
|||
|
public readonly IEnumerable<IValidator<TRequest>> _validators;
|
|||
|
|
|||
|
public ValidationBehavior(IEnumerable<IValidator<TRequest>> validators)
|
|||
|
{
|
|||
|
_validators = validators;
|
|||
|
}
|
|||
|
|
|||
|
public Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
|
|||
|
{
|
|||
|
var context = new ValidationContext<TRequest>(request);
|
|||
|
var failures = _validators
|
|||
|
.Select(v => v.Validate(context))
|
|||
|
.SelectMany(result => result.Errors)
|
|||
|
.Where(f => f != null)
|
|||
|
.ToList();
|
|||
|
|
|||
|
if (failures.Count != 0)
|
|||
|
{
|
|||
|
throw new ValidationException(failures);
|
|||
|
}
|
|||
|
|
|||
|
return next();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|