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" />
<PackageReference Include="Goldev.Core.MediatR" />
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
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#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
#tool nuget:?package=Goldev.Core.MediatR&version=8.2.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
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 | Versions 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.
-
net8.0
- Goldev.Core (>= 8.2.0)
- MediatR (>= 12.4.1)
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.2)
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.