Infrastructure

This commit is contained in:
2026-04-22 20:51:02 +04:30
parent c64c3dd9be
commit 64ee78e320
199 changed files with 7428 additions and 1027 deletions
@@ -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>