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
{
}
}