Introduced abstract UpdateCommand<TUpdateDto, TEntity> and UpdateCommandHandler<TCommand, TUpdateDto, TEntity> in EnvelopeGenerator.Application.Common.Commands. This provides a reusable, type-safe pattern for update operations using a generic repository and MediatR, requiring implementers to supply an update DTO and a query expression for entity selection.
59 lines
1.6 KiB
C#
59 lines
1.6 KiB
C#
using DigitalData.Core.Abstraction.Application.Repository;
|
|
using MediatR;
|
|
using System.Linq.Expressions;
|
|
|
|
namespace EnvelopeGenerator.Application.Common.Commands;
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <typeparam name="TUpdateDto"></typeparam>
|
|
/// <typeparam name="TEntity"></typeparam>
|
|
public abstract record UpdateCommand<TUpdateDto, TEntity> : IRequest where TUpdateDto : class where TEntity : class
|
|
{
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public TUpdateDto Update { get; init; } = null!;
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public abstract Expression<Func<TEntity, bool>> BuildQueryExpression();
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <typeparam name="TCommand"></typeparam>
|
|
/// <typeparam name="TUpdateDto"></typeparam>
|
|
/// <typeparam name="TEntity"></typeparam>
|
|
public class UpdateCommandHandler<TCommand, TUpdateDto, TEntity> : IRequestHandler<TCommand>
|
|
where TUpdateDto : class
|
|
where TEntity : class
|
|
where TCommand : UpdateCommand<TUpdateDto, TEntity>
|
|
{
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
protected readonly IRepository<TEntity> Repository;
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="repository"></param>
|
|
public UpdateCommandHandler(IRepository<TEntity> repository)
|
|
{
|
|
Repository = repository;
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="request"></param>
|
|
/// <param name="cancel"></param>
|
|
/// <returns></returns>
|
|
public Task Handle(TCommand request, CancellationToken cancel)
|
|
=> Repository.UpdateAsync(request.Update, request.BuildQueryExpression(), cancel);
|
|
} |