Infrastructure
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
using FluentValidation.Results;
|
||||
|
||||
namespace Vizhvizh.BuildingBlocks.Application.Exceptions;
|
||||
|
||||
public class CommandValidationException : Exception
|
||||
{
|
||||
public CommandValidationException(List<ValidationFailure> errors)
|
||||
{
|
||||
Errors = errors;
|
||||
}
|
||||
|
||||
public List<ValidationFailure> Errors { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
using FluentValidation;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using Vizhvizh.BuildingBlocks.Application.Configuration.Commnad;
|
||||
using Vizhvizh.BuildingBlocks.Application.Exceptions;
|
||||
using Vizhvizh.BuildingBlocks.Domain.Contract;
|
||||
|
||||
namespace Vizhvizh.BuildingBlocks.Application.Validations;
|
||||
|
||||
public class ValidationCommandHandlerDecorator<TCommand> : ICommandHandler<TCommand>
|
||||
where TCommand : ICommand
|
||||
{
|
||||
private readonly ICommandHandler<TCommand> _decorated;
|
||||
private readonly IEnumerable<IValidator<TCommand>> _validators;
|
||||
|
||||
public ValidationCommandHandlerDecorator(
|
||||
ICommandHandler<TCommand> decorated,
|
||||
IEnumerable<IValidator<TCommand>> validators)
|
||||
{
|
||||
_decorated = decorated;
|
||||
_validators = validators;
|
||||
}
|
||||
|
||||
public async Task Handle(TCommand command, CancellationToken cancellationToken)
|
||||
{
|
||||
if (_validators.Any())
|
||||
{
|
||||
var context = new ValidationContext<TCommand>(command);
|
||||
var validationResults = await Task.WhenAll(
|
||||
_validators.Select(v => v.ValidateAsync(context, cancellationToken)));
|
||||
|
||||
var failures = validationResults
|
||||
.SelectMany(r => r.Errors)
|
||||
.Where(f => f != null)
|
||||
.ToList();
|
||||
|
||||
if (failures.Any())
|
||||
{
|
||||
throw new CommandValidationException(failures);
|
||||
}
|
||||
}
|
||||
|
||||
await _decorated.Handle(command, cancellationToken);
|
||||
}
|
||||
}
|
||||
|
||||
// اگر Command شما خروجی دارد (ICommandHandler<TCommand, TResult>)
|
||||
public class ValidationCommandHandlerDecorator<TCommand, TResult> : ICommandHandler<TCommand, TResult>
|
||||
where TCommand : ICommand<TResult>
|
||||
{
|
||||
private readonly ICommandHandler<TCommand, TResult> _decorated;
|
||||
private readonly IEnumerable<IValidator<TCommand>> _validators;
|
||||
|
||||
public ValidationCommandHandlerDecorator(
|
||||
ICommandHandler<TCommand, TResult> decorated,
|
||||
IEnumerable<IValidator<TCommand>> validators)
|
||||
{
|
||||
_decorated = decorated;
|
||||
_validators = validators;
|
||||
}
|
||||
|
||||
public async Task<TResult> Handle(TCommand command, CancellationToken cancellationToken)
|
||||
{
|
||||
if (_validators.Any())
|
||||
{
|
||||
var context = new ValidationContext<TCommand>(command);
|
||||
var validationResults = await Task.WhenAll(
|
||||
_validators.Select(v => v.ValidateAsync(context, cancellationToken)));
|
||||
|
||||
var failures = validationResults
|
||||
.SelectMany(r => r.Errors)
|
||||
.Where(f => f != null)
|
||||
.ToList();
|
||||
|
||||
if (failures.Any())
|
||||
{
|
||||
throw new CommandValidationException(failures);
|
||||
}
|
||||
}
|
||||
|
||||
return await _decorated.Handle(command, cancellationToken);
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,16 @@
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="FluentValidation" Version="12.1.1" />
|
||||
<PackageReference Include="Microsoft.Data.SqlClient" Version="6.0.1" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.25" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="8.0.25" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.25" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="Scrutor" Version="6.1.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\VichVich.BuildingBlocks.Domain\Vizhvizh.BuildingBlocks.Domain.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
Reference in New Issue
Block a user