RShared.Mediator
10.0.4
dotnet add package RShared.Mediator --version 10.0.4
NuGet\Install-Package RShared.Mediator -Version 10.0.4
<PackageReference Include="RShared.Mediator" Version="10.0.4" />
<PackageVersion Include="RShared.Mediator" Version="10.0.4" />
<PackageReference Include="RShared.Mediator" />
paket add RShared.Mediator --version 10.0.4
#r "nuget: RShared.Mediator, 10.0.4"
#:package RShared.Mediator@10.0.4
#addin nuget:?package=RShared.Mediator&version=10.0.4
#tool nuget:?package=RShared.Mediator&version=10.0.4
RShared.Mediator
Минимальный mediator: одно сообщение — один хендлер. Без пайплайнов, мидлварей и фан-аута — только точечный диспетч через DI.
Как работает
- Хендлеры регистрируются по закрытым интерфейсам
IMessageHandler<TMessage>/IMessageHandler<TRequest, TResponse>как scoped. - Медиатор — scoped; на
Sendиз скоупа резолвится только нужный хендлер и только его зависимости, а не все хендлеры разом. - Попытка зарегистрировать два хендлера на одно сообщение — ошибка на старте, а не сюрприз в рантайме.
Подключение
builder.AddMediator(); // WebApplicationBuilder
// или
services.AddMediator(); // IServiceCollection
Опции MediatorOption:
AddHandlers = true(по умолчанию) — автоскан реализацийIMessageHandlerпо сборкам и их регистрация;Assemblies— какие сборки сканировать; не задано — все загруженные вAppDomain.
Открытые generic-хендлеры (class MyHandler<T> : IMessageHandler<T>) скан не берёт — регистрируй руками:
services.AddScoped(typeof(IMessageHandler<>), typeof(MyHandler<>));
Использование
// сообщение
public record Ping(string Text);
// хендлер сообщения
public class PingHandler : IMessageHandler<Ping>
{
public Task HandleAsync(Ping message, CancellationToken cancellationToken = default)
{
return Task.CompletedTask;
}
}
// запрос с ответом
public record Echo(string Text);
public class EchoHandler : IMessageHandler<Echo, string>
{
public Task<string> HandleAsync(Echo request, CancellationToken cancellationToken = default)
{
return Task.FromResult($"echo: {request.Text}");
}
}
Отправка:
await mediator.SendAsync(new Ping("привет"));
string answer = await mediator.SendAsync<Echo, string>(new Echo("привет"));
Хендлер не зарегистрирован — InvalidOperationException от DI с точным именем интерфейса, который не найден.
Изменения с 0.1
Хендлеры больше не регистрируются маркером IMessageHandler: инъекция IEnumerable<IMessageHandler> больше не собирает хендлеры, диспетч идёт только по закрытым интерфейсам.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. 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. |
-
net10.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.