BugFree.MediatR.Memory
1.0.2025.1119-beta1112
dotnet add package BugFree.MediatR.Memory --version 1.0.2025.1119-beta1112
NuGet\Install-Package BugFree.MediatR.Memory -Version 1.0.2025.1119-beta1112
<PackageReference Include="BugFree.MediatR.Memory" Version="1.0.2025.1119-beta1112" />
<PackageVersion Include="BugFree.MediatR.Memory" Version="1.0.2025.1119-beta1112" />
<PackageReference Include="BugFree.MediatR.Memory" />
paket add BugFree.MediatR.Memory --version 1.0.2025.1119-beta1112
#r "nuget: BugFree.MediatR.Memory, 1.0.2025.1119-beta1112"
#:package BugFree.MediatR.Memory@1.0.2025.1119-beta1112
#addin nuget:?package=BugFree.MediatR.Memory&version=1.0.2025.1119-beta1112&prerelease
#tool nuget:?package=BugFree.MediatR.Memory&version=1.0.2025.1119-beta1112&prerelease
BugFree.MediatR 说明
BugFree.MediatR 是一个轻量的通知发布-订阅中介器实现,面向 .NET 平台,包含:
- Core:
BugFree.MediatR(接口与通用 DI 扩展) - 内存实现:
BugFree.MediatR.Memory - Redis 分布式实现:
BugFree.MediatR.Redis
适用于本进程解耦的通知分发,或通过 Redis 队列实现跨进程/跨节点的简单分布式通知广播。
功能特性
- 接口最小化:
IMediator、INotification、INotificationHandler<T> - DI 一键扫描处理器:
services.AddNotificationHandlers(...) - 内存版中介器:零外部依赖,低开销,表达式缓存无反射热路径
- Redis 版中介器:基于
NewLife.Redis的队列,发布/订阅分离,支持托管后台订阅服务 - 处理器多实例注册(按泛型闭包接口注册),避免重复注入
目标框架
当前三个项目均为 net8.0。按 BugFree 生态规范,后续将视需要补充多目标框架(netstandard2.0/2.1、net6.0+ 等)同时保持 API 稳定与二进制兼容。
安装与引用
在解决方案中直接引用对应项目,或通过 NuGet(若已发布)引用以下包:
BugFree.MediatRBugFree.MediatR.MemoryBugFree.MediatR.Redis
Redis 版依赖:NewLife.Redis
核心接口
public interface INotification { }
public interface INotificationHandler<in TNotification> where TNotification : INotification
{
ValueTask Handle(TNotification notification, CancellationToken cancellationToken);
}
public interface IMediator
{
Task Publish(INotification notification, CancellationToken cancellationToken = default);
}
扫描并注册处理器
BugFree.MediatR 提供 AddNotificationHandlers 扩展,可批量扫描并按接口闭包 INotificationHandler<T> 注册处理器(默认 Singleton 生命周期):
// 扫描当前 AppDomain 已加载程序集(默认)
services.AddNotificationHandlers();
// 或指定过滤器(仅包含以 BugFree. 开头的程序集)
services.AddNotificationHandlers(true, asm => asm.GetName().Name!.StartsWith("BugFree."));
// 或显式传入要扫描的程序集
services.AddNotificationHandlers(false, null, typeof(Program).Assembly);
内存版与 Redis 版注册扩展会自动调用该扫描逻辑。
内存中介器(BugFree.MediatR.Memory)
内存实现适用于单进程内的通知分发,零外部依赖,使用表达式树缓存委托,避免反射/动态开销。
注册:
services.AddMemoryMediator();
定义通知与处理器:
public sealed class UserCreated : INotification
{
public string? Id { get; set; }
}
public sealed class UserCreatedHandler : INotificationHandler<UserCreated>
{
public ValueTask Handle(UserCreated notification, CancellationToken cancellationToken)
{
Console.WriteLine($"UserCreated: {notification.Id}");
return ValueTask.CompletedTask;
}
}
发布通知:
var sp = new ServiceCollection()
.AddMemoryMediator()
.BuildServiceProvider();
var mediator = sp.GetRequiredService<IMediator>();
await mediator.Publish(new UserCreated { Id = "42" });
注意:MemoryMediator 当前通过 GetService(INotificationHandler<T>) 获取单个处理器并调用,若注册了多个同类型处理器,将调用第一个可解析的处理器。
Redis 中介器(BugFree.MediatR.Redis)
Redis 版将发布与消费解耦:
- 发布:
IMediator.Publish将通知序列化为 JSON 并写入 Redis 队列 - 订阅:后台托管服务批量从队列取出,反序列化并依次调用所有匹配处理器
注册(仅发布,不自动订阅):
services.AddRedisMediator(o =>
{
o.Configuration = "server=192.168.31.200:6379;password=Ace12345678!;db=0;timeout=3000"; // 典型配置,亦可设置 Password/Db 等
o.QueueName = "bugfree.mediatr.notify"; // 可选,默认同名
o.BatchSize = 10; // 可选
o.IdleDelay = 1000; // 可选(毫秒)
});
注册后台订阅服务(消费与分发到处理器):
builder.Services.AddRedisMediatorWorker(o =>
{
o.Configuration = "server=192.168.31.200:6379;password=Ace12345678!;db=0;timeout=3000";
o.QueueName = "bugfree.mediatr.notify";
});
典型主机构建示例:
var builder = Host.CreateDefaultBuilder(args)
.ConfigureServices(services =>
{
services.AddNotificationHandlers(); // 可省略,Redis 扩展内部会调用
services.AddRedisMediator(o => o.Configuration = "server=192.168.31.200:6379;password=Ace12345678!;db=0;timeout=3000");
services.AddRedisMediatorWorker(o => o.Configuration = "server=192.168.31.200:6379;password=Ace12345678!;db=0;timeout=3000");
});
await builder.Build().RunAsync();
选项说明(RedisMediatorOptions):
QueueName:队列名,默认bugfree.mediatr.notifyIdleDelay:空闲等待(毫秒),默认 1000
性能与实现要点
- 处理器调用使用表达式树编译的委托并做类型闭包缓存(
ConcurrentDictionary<Type, Func<...>>) - 内存版同步完成路径直接返回已完成任务,减少分配
- Redis 订阅使用批量
TakeOneAsync与轻量异常回退,避免热循环阻塞
最佳实践
- 为每个通知定义单一职责的
INotificationHandler<T>;Redis 订阅端会按序广播给所有同类型处理器 - 仅在确有跨进程广播需求时使用 Redis 版;纯进程内推荐内存版以获得最低延迟
- 使用
AddNotificationHandlers(predicate: ...)约束扫描范围,减少启动扫描开销
构建
在仓库根目录:
dotnet build BugFree.sln
许可
默认遵循仓库 MIT 许可。
| 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. |
-
net8.0
- BugFree.MediatR (>= 1.0.2025.1119-beta1105)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.2025.1119-beta1112 | 424 | 11/19/2025 |
| 1.0.2025.1119-beta1053 | 403 | 11/19/2025 |