Goldev.Core.MediatR 8.2.0

dotnet add package Goldev.Core.MediatR --version 8.2.0
                    
NuGet\Install-Package Goldev.Core.MediatR -Version 8.2.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Goldev.Core.MediatR" Version="8.2.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Goldev.Core.MediatR" Version="8.2.0" />
                    
Directory.Packages.props
<PackageReference Include="Goldev.Core.MediatR" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Goldev.Core.MediatR --version 8.2.0
                    
#r "nuget: Goldev.Core.MediatR, 8.2.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Goldev.Core.MediatR@8.2.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Goldev.Core.MediatR&version=8.2.0
                    
Install as a Cake Addin
#tool nuget:?package=Goldev.Core.MediatR&version=8.2.0
                    
Install as a Cake Tool

Goldev.Core.MediatR

Пакет для работы с MediatR

Примеры использования

  • Подключение
services.AddMediatR<Program>() // Настройка DI
  • Модель запроса
/// <summary>
/// Модель запроса с возвращаемым значением
/// </summary>
public class TestQueryModel : IRequestModel<int> // указываем тип возвращаемого значения
{
    /// <summary>
    /// Параметр запроса
    /// </summary>
    public int QueryParameter { get; init; } = new Random().Next();
}
/// <summary>
/// Модель запроса без возвращаемого значения
/// </summary>
public class TestCommandModel : IRequestModel
{
    /// <summary>
    /// Параметр запроса
    /// </summary>
    public int CommandParameter { get; init; } = new Random().Next();
}
  • Реализация хендлера
/// <summary>
/// Хендлер с возвращаемым значением
/// </summary>
public class TestQueryHandler : AbstractQueryHandler<TestQueryModel, int>
{
    public TestQueryHandler(
        ILogger<TestQueryHandler> logger,
        IMediator mediator)  // Опционально (требуется если будем использовать MediatorSendAsync)
        : base(logger, mediator) 
    {
        ErrorMessage = "Ошибка"; // По умолчанию: "Во время обработки запроса произошла ошибка"
        ErrorLog = "Ошибка в хендлере {name} при значении {value}"; // По умолчанию: "В хендлере {name} произошла ошибка", где name имя хендлера (TestQueryHandler)
        ErrorLogParams = x => [nameof(TestQueryHandler), x.QueryParameter];   
        ErrorStatusCode = HttpStatusCode.InternalServerError; // По умолчанию: InternalServerError
    }

    public async override Task<IHandleResult<int>> HandleAsync(TestQueryModel query, CancellationToken cancellationToken)
    {
        if (query.QueryParameter % 5 == 0)
        {
            return await Error(new Exception(), "Ошибка вышла", "Вышла ошибка при значении {val} в хендлере {handler}", query.QueryParameter, nameof(TestQueryHandler)); 
        }

        if (query.QueryParameter % 2 == 0)
        {
            return await BadRequest("Что то не то");
        }

        // Вызов медиатера
        await MediatorSendAsync(new TestCommandModel()
        {
        }, cancellationToken); // В случае обработки с ошибкой, внешний хендлер тоже завершится с ошибкой

        // Вызов медиатера
        int response = await MediatorSendAsync(new TestQueryModel()
        {
        }, cancellationToken); // В случае обработки с ошибкой, внешний хендлер тоже завершится с ошибкой

        int result = (query.QueryParameter * 10) % 100007;

        return await Ok(result, "всё ок при значении {v}", HttpStatusCode.OK, query.QueryParameter);
    }
}
/// <summary>
/// Хендлер без возвращаемого значения
/// </summary>
public class TestCommandHandler : AbstractCommandHandler<TestCommandModel>
{
    public TestCommandHandler(
        ILogger<TestQueryHandler> logger,
        IMediator mediator) // Опционально (требуется если будем использовать MediatorSendAsync)
        : base(logger, mediator)
    {
        ErrorMessage = "Ошибка"; // По умолчанию: "Во время обработки запроса произошла ошибка"
        ErrorLog = "Ошибка в хендлере {name} при значении {value}"; // По умолчанию: "В хендлере {name} произошла ошибка", где name имя хендлера (TestQueryHandler)
        ErrorLogParams = x => [nameof(TestQueryHandler), x.CommandParameter];
        ErrorStatusCode = System.Net.HttpStatusCode.InternalServerError; // По умолчанию: InternalServerError
    }

    public override async Task<IHandleResult> HandleAsync(TestCommandModel command, CancellationToken cancellationToken)
    {
        // Вызов медиатера
        int response = await MediatorSendAsync(new TestQueryModel()
        {
        }, cancellationToken); // В случае обработки с ошибкой, внешний хендлер тоже завершится с ошибкой

        // Вызов медиатера
        await MediatorSendAsync(new TestCommandModel()
        {
        }, cancellationToken); // В случае обработки с ошибкой, внешний хендлер тоже завершится с ошибкой

        if (response % 3 == 0)
        {
            // Выйти с ошибкой пользователя
            return await BadRequest("Что то не то", "Что то не то со значением {res}", HttpStatusCode.BadRequest, response);
        }

        if (response % 11 == 0)
        {
            // Выбросить ошибку
            return await Error(new Exception(), "Ошибка вышла", "Вышла ошибка при значении {val} в хендлере {handler}", HttpStatusCode.BadRequest, response, nameof(TestCommandHandler));
        }

        return await Ok("всё ок при значении {v}", HttpStatusCode.OK, command.CommandParameter);
    }
}
  • Использование
ResponseModel response = await _mediator.Send(new TestCommandModel()
{
    CommandParameter = 123
});

bool isError = response.IsError;        // Флаг, говорящий, завершилась ли обработка с ошибкой
string message = response.ErrorText;    // сообщения об ошибке (опционально) 

HttpStatusCode httpCode = response.HttpStatusCode; // Код ответа
int intCode = response.ResponseCode; // Код ответа в виде числа
ResponseModel<int> response = await _mediator.Send(new TestQueryModel()
{
    QueryParameter = 123
});

int result = response.Response;         // Результат выполнения
bool isError = response.IsError;        // Флаг, говорящий, завершилась ли обработка с ошибкой
string message = response.ErrorText;    // сообщения об ошибке (опционально) 

HttpStatusCode httpCode = response.HttpStatusCode; // Код ответа
int intCode = response.ResponseCode; // Код ответа в виде числа
  • Маппинг результатов с ошибкой
ResponseModel<int> response;
response = await _mediator.Send(new TestQueryModel()
{
	QueryParameter = 123
});

ResponseModel responseModelSimple = response.ErrorResponse(); // из ResponseModel<TSource> в ResponseModel
ResponseModel<double> responseModelGeneric1 = response.ErrorResponse<int, double>(); // из ResponseModel<TSource> в ResponseModel<TDestanation>
ResponseModel<double> responseModelGeneric2 = responseModelSimple.ErrorResponse<double>(); // из ResponseModel в ResponseModel<TSource>
Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Goldev.Core.MediatR:

Package Downloads
Goldev.Core.AspNetCore

Package Description

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
8.2.0 2,720 12/4/2024
8.1.5 387 11/21/2024
8.1.4 195 10/28/2024
8.1.3 173 10/25/2024
8.1.2 230 9/30/2024 8.1.2 is deprecated because it is no longer maintained.
8.1.0 218 9/6/2024 8.1.0 is deprecated because it is no longer maintained.