Добавил вспомогательный функционал

This commit is contained in:
bekodeg
2025-06-17 20:25:53 +04:00
parent 92e8944983
commit 4c75d24f4c
5 changed files with 209 additions and 2 deletions

View File

@@ -0,0 +1,100 @@
using ApplicationSystem.MediatRHelper.Models;
using MediatR;
using Microsoft.Extensions.Logging;
using System.Net;
namespace ApplicationSystem.MediatRHelper.AbstractHandlers
{
/// <summary>
/// Абстрактный обработчик команды
/// </summary>
/// <typeparam name="TRequest"></typeparam>
public abstract class AbstractCommandHandler<TRequest>(ILogger logger)
: IRequestHandler<TRequest, ResponseModel> where TRequest : IRequestModel
{
private readonly ILogger _logger = logger;
/// <summary>
/// Обработчик
/// </summary>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
protected abstract Task<ResponseModel> HandleAsync(
TRequest request, CancellationToken cancellationToken);
public async Task<ResponseModel> Handle(TRequest request, CancellationToken cancellationToken)
{
try
{
var response = await HandleAsync(request, cancellationToken);
_logger.LogInformation("Обработчик {handlerName} успешно завершил работу", GetType().FullName);
return response;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка в обработчике {handlerName}", GetType().FullName);
return new ResponseModel()
{
ResponseStatusCode = HttpStatusCode.InternalServerError,
};
}
}
/// <summary>
/// Успешный результат
/// </summary>
/// <returns></returns>
protected ResponseModel Ok() => new()
{
ResponseStatusCode = HttpStatusCode.OK,
};
/// <summary>
/// Неверный запрос
/// </summary>
/// <returns></returns>
protected ResponseModel BadRequest() => new()
{
ResponseStatusCode = HttpStatusCode.BadRequest,
};
/// <summary>
/// Результат с кодом
/// </summary>
/// <param name="statusCode"></param>
/// <returns></returns>
protected ResponseModel StatusCode(int statusCode) => new()
{
ResponseStatusCode = (HttpStatusCode)statusCode,
};
/// <summary>
/// Результат с кодом
/// </summary>
/// <param name="statusCode"></param>
/// <returns></returns>
protected ResponseModel StatusCode(HttpStatusCode statusCode) => new()
{
ResponseStatusCode = statusCode,
};
/// <summary>
/// Проброс не успешного результата
/// </summary>
/// <typeparam name="TSource"></typeparam>
/// <param name="sourceResponse"></param>
/// <returns></returns>
protected ResponseModel ErrorResponse<TSource>(
ResponseModel<TSource> sourceResponse) => sourceResponse;
/// <summary>
/// Проброс не успешного результата
/// </summary>
/// <param name="sourceResponse"></param>
/// <returns></returns>
protected ResponseModel ErrorResponse(
ResponseModel sourceResponse) => sourceResponse;
}
}

View File

@@ -0,0 +1,106 @@
using ApplicationSystem.MediatRHelper.Models;
using MediatR;
using Microsoft.Extensions.Logging;
using System.Net;
namespace ApplicationSystem.MediatRHelper.AbstractHandlers
{
/// <summary>
/// Абстрактный обработчик запроса
/// </summary>
public abstract class AbstractQueryHandler<TRequest, TResponse>(
ILogger logger)
: IRequestHandler<TRequest, ResponseModel<TResponse>> where TRequest : IRequestModel<TResponse>
{
protected readonly ILogger _logger = logger;
/// <summary>
/// Обработчик
/// </summary>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
protected abstract Task<ResponseModel<TResponse>> HandleAsync(
TRequest request, CancellationToken cancellationToken);
public async Task<ResponseModel<TResponse>> Handle(TRequest request, CancellationToken cancellationToken)
{
try
{
var response = await HandleAsync(request, cancellationToken);
_logger.LogInformation("Обработчик {handlerName} успешно завершил работу", GetType().FullName);
return response;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка в обработчике {handlerName}", GetType().FullName);
return new ResponseModel<TResponse>()
{
ResponseStatusCode = HttpStatusCode.InternalServerError,
};
}
}
/// <summary>
/// Успешный результат
/// </summary>
/// <returns></returns>
protected ResponseModel<TResponse> Ok() => new()
{
ResponseStatusCode = HttpStatusCode.OK,
};
/// <summary>
/// Неверный запрос
/// </summary>
/// <returns></returns>
protected ResponseModel<TResponse> BadRequest() => new()
{
ResponseStatusCode = HttpStatusCode.BadRequest,
};
/// <summary>
/// Результат с кодом
/// </summary>
/// <param name="statusCode"></param>
/// <returns></returns>
protected ResponseModel<TResponse> StatusCode(int statusCode) => new()
{
ResponseStatusCode = (HttpStatusCode)statusCode,
};
/// <summary>
/// Результат с кодом
/// </summary>
/// <param name="statusCode"></param>
/// <returns></returns>
protected ResponseModel<TResponse> StatusCode(HttpStatusCode statusCode) => new()
{
ResponseStatusCode = statusCode,
};
/// <summary>
/// Проброс не успешного результата
/// </summary>
/// <typeparam name="TSource"></typeparam>
/// <param name="sourceResponse"></param>
/// <returns></returns>
protected ResponseModel<TResponse> ErrorResponse<TSource>(
ResponseModel<TSource> sourceResponse) => new()
{
ResponseStatusCode = sourceResponse.ResponseStatusCode,
};
/// <summary>
/// Проброс не успешного результата
/// </summary>
/// <param name="sourceResponse"></param>
/// <returns></returns>
protected ResponseModel<TResponse> ErrorResponse(
ResponseModel sourceResponse) => new()
{
ResponseStatusCode = sourceResponse.ResponseStatusCode,
};
}
}

View File

@@ -8,6 +8,7 @@
<ItemGroup>
<PackageReference Include="MediatR" Version="8.1.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.2" />
</ItemGroup>
</Project>

View File

@@ -5,7 +5,7 @@ namespace ApplicationSystem.MediatRHelper.Models
/// <summary>
/// Запрос к медиатору
/// </summary>
public interface IRequestModel<TResponse> : IRequest<TResponse>
public interface IRequestModel<TResponse> : IRequest<ResponseModel<TResponse>>
{
}
}

View File

@@ -5,7 +5,7 @@ namespace ApplicationSystem.MediatRHelper.Models
/// <summary>
/// Запрос к медиатору без параметров
/// </summary>
public interface IRequestModelWP : IRequest<ResponseModel>
public interface IRequestModel : IRequest<ResponseModel>
{
}
}