Добавил вспомогательный функционал
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="MediatR" Version="8.1.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.2" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -5,7 +5,7 @@ namespace ApplicationSystem.MediatRHelper.Models
|
||||
/// <summary>
|
||||
/// Запрос к медиатору
|
||||
/// </summary>
|
||||
public interface IRequestModel<TResponse> : IRequest<TResponse>
|
||||
public interface IRequestModel<TResponse> : IRequest<ResponseModel<TResponse>>
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ namespace ApplicationSystem.MediatRHelper.Models
|
||||
/// <summary>
|
||||
/// Запрос к медиатору без параметров
|
||||
/// </summary>
|
||||
public interface IRequestModelWP : IRequest<ResponseModel>
|
||||
public interface IRequestModel : IRequest<ResponseModel>
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user