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