diff --git a/ApplicationSystem.MediatrHelper/AbstractHandlers/AbstractCommandHandler.cs b/ApplicationSystem.MediatrHelper/AbstractHandlers/AbstractCommandHandler.cs new file mode 100644 index 0000000..dbef62a --- /dev/null +++ b/ApplicationSystem.MediatrHelper/AbstractHandlers/AbstractCommandHandler.cs @@ -0,0 +1,100 @@ +using ApplicationSystem.MediatRHelper.Models; +using MediatR; +using Microsoft.Extensions.Logging; +using System.Net; + +namespace ApplicationSystem.MediatRHelper.AbstractHandlers +{ + /// + /// Абстрактный обработчик команды + /// + /// + public abstract class AbstractCommandHandler(ILogger logger) + : IRequestHandler where TRequest : IRequestModel + { + private readonly ILogger _logger = logger; + + /// + /// Обработчик + /// + /// + /// + /// + protected abstract Task HandleAsync( + TRequest request, CancellationToken cancellationToken); + + public async Task 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, + }; + } + } + + /// + /// Успешный результат + /// + /// + protected ResponseModel Ok() => new() + { + ResponseStatusCode = HttpStatusCode.OK, + }; + + /// + /// Неверный запрос + /// + /// + protected ResponseModel BadRequest() => new() + { + ResponseStatusCode = HttpStatusCode.BadRequest, + }; + + /// + /// Результат с кодом + /// + /// + /// + protected ResponseModel StatusCode(int statusCode) => new() + { + ResponseStatusCode = (HttpStatusCode)statusCode, + }; + + /// + /// Результат с кодом + /// + /// + /// + protected ResponseModel StatusCode(HttpStatusCode statusCode) => new() + { + ResponseStatusCode = statusCode, + }; + + /// + /// Проброс не успешного результата + /// + /// + /// + /// + protected ResponseModel ErrorResponse( + ResponseModel sourceResponse) => sourceResponse; + + /// + /// Проброс не успешного результата + /// + /// + /// + protected ResponseModel ErrorResponse( + ResponseModel sourceResponse) => sourceResponse; + } +} diff --git a/ApplicationSystem.MediatrHelper/AbstractHandlers/AbstractQueryHandler.cs b/ApplicationSystem.MediatrHelper/AbstractHandlers/AbstractQueryHandler.cs new file mode 100644 index 0000000..c975baf --- /dev/null +++ b/ApplicationSystem.MediatrHelper/AbstractHandlers/AbstractQueryHandler.cs @@ -0,0 +1,106 @@ +using ApplicationSystem.MediatRHelper.Models; +using MediatR; +using Microsoft.Extensions.Logging; +using System.Net; + +namespace ApplicationSystem.MediatRHelper.AbstractHandlers +{ + /// + /// Абстрактный обработчик запроса + /// + public abstract class AbstractQueryHandler( + ILogger logger) + : IRequestHandler> where TRequest : IRequestModel + { + protected readonly ILogger _logger = logger; + + /// + /// Обработчик + /// + /// + /// + /// + protected abstract Task> HandleAsync( + TRequest request, CancellationToken cancellationToken); + + public async Task> 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, + }; + } + } + + /// + /// Успешный результат + /// + /// + protected ResponseModel Ok() => new() + { + ResponseStatusCode = HttpStatusCode.OK, + }; + + /// + /// Неверный запрос + /// + /// + protected ResponseModel BadRequest() => new() + { + ResponseStatusCode = HttpStatusCode.BadRequest, + }; + + /// + /// Результат с кодом + /// + /// + /// + protected ResponseModel StatusCode(int statusCode) => new() + { + ResponseStatusCode = (HttpStatusCode)statusCode, + }; + + /// + /// Результат с кодом + /// + /// + /// + protected ResponseModel StatusCode(HttpStatusCode statusCode) => new() + { + ResponseStatusCode = statusCode, + }; + + /// + /// Проброс не успешного результата + /// + /// + /// + /// + protected ResponseModel ErrorResponse( + ResponseModel sourceResponse) => new() + { + ResponseStatusCode = sourceResponse.ResponseStatusCode, + }; + + /// + /// Проброс не успешного результата + /// + /// + /// + protected ResponseModel ErrorResponse( + ResponseModel sourceResponse) => new() + { + ResponseStatusCode = sourceResponse.ResponseStatusCode, + }; + } +} diff --git a/ApplicationSystem.MediatrHelper/ApplicationSystem.MediatRHelper.csproj b/ApplicationSystem.MediatrHelper/ApplicationSystem.MediatRHelper.csproj index ec79322..5b2cbd0 100644 --- a/ApplicationSystem.MediatrHelper/ApplicationSystem.MediatRHelper.csproj +++ b/ApplicationSystem.MediatrHelper/ApplicationSystem.MediatRHelper.csproj @@ -8,6 +8,7 @@ + diff --git a/ApplicationSystem.MediatrHelper/Models/IRequestModel.cs b/ApplicationSystem.MediatrHelper/Models/IRequestModel.cs index 5bd7a6e..8d27285 100644 --- a/ApplicationSystem.MediatrHelper/Models/IRequestModel.cs +++ b/ApplicationSystem.MediatrHelper/Models/IRequestModel.cs @@ -5,7 +5,7 @@ namespace ApplicationSystem.MediatRHelper.Models /// /// Запрос к медиатору /// - public interface IRequestModel : IRequest + public interface IRequestModel : IRequest> { } } diff --git a/ApplicationSystem.MediatrHelper/Models/IRequestModelWP.cs b/ApplicationSystem.MediatrHelper/Models/IRequestModelWP.cs index bd8d68b..c54a459 100644 --- a/ApplicationSystem.MediatrHelper/Models/IRequestModelWP.cs +++ b/ApplicationSystem.MediatrHelper/Models/IRequestModelWP.cs @@ -5,7 +5,7 @@ namespace ApplicationSystem.MediatRHelper.Models /// /// Запрос к медиатору без параметров /// - public interface IRequestModelWP : IRequest + public interface IRequestModel : IRequest { } }