Extensibility - dotnet-shashlik/shashlik.eventbus GitHub Wiki
扩展接口
Shashlik.EventBus 提供 18 个可替换接口,覆盖从 ID 生成到消息收发的全流程。所有默认实现通过 TryAddSingleton 注册,自定义实现只需在 AddEventBus 之前或之后注册即可覆盖。
接口列表
核心流程
| 接口 |
默认实现 |
说明 |
IEventPublisher |
DefaultEventPublisher |
事件发布器,负责持久化消息并异步发送 |
IPublishHandler |
DefaultPublishHandler |
发布处理器,负责实际发送消息到中间件并更新状态 |
IReceivedHandler |
DefaultReceivedHandler |
接收处理器,负责调用事件处理器并更新状态 |
IMessageListener |
DefaultMessageListener |
消息监听器,接收消息后保存并调度执行 |
IEventHandlerInvoker |
DefaultEventHandlerInvoker |
事件处理器调用器,在新的 ServiceScope 中执行处理器 |
IEventHandlerFindProvider |
DefaultEventHandlerFindProvider |
事件处理器扫描器,扫描程序集中所有 IEventHandler<T> 实现 |
命名与 ID
| 接口 |
默认实现 |
说明 |
IEventNameRuler |
DefaultNameRuler |
事件名称规则,对应消息队列的 topic/routingKey |
IEventHandlerNameRuler |
DefaultNameRuler |
事件处理器名称规则,对应消息队列的 queue/group |
IMsgIdGenerator |
GuidMsgIdGenerator |
传输消息 ID 生成器(全局唯一) |
IIdGenerator |
YitIdGenerator |
存储消息 ID 生成器(雪花 ID),详见 配置参考 - ID 生成器 |
序列化
| 接口 |
默认实现 |
说明 |
IMessageSerializer |
DefaultJsonSerializer |
消息序列化/反序列化,默认使用 System.Text.Json |
重试与过期
| 接口 |
默认实现 |
说明 |
IPublishedMessageRetryProvider |
DefaultPublishedMessageRetryProvider |
已发布消息重试器 |
IReceivedMessageRetryProvider |
DefaultReceivedMessageRetryProvider |
已接收消息重试器 |
IExpiredMessageProvider |
DefaultExpiredMessageProvider |
过期消息清理器 |
存储与传输
| 接口 |
默认实现 |
说明 |
IMessageStorage |
由存储包提供 |
消息存储操作 |
IMessageStorageInitializer |
由存储包提供 |
存储介质初始化(建表等) |
IMessageSender |
由传输包提供 |
消息发送到中间件 |
IEventSubscriber |
由传输包提供 |
从中间件订阅接收消息 |
替换方式
在 AddEventBus 之前注册自定义实现即可覆盖默认实现:
// 替换消息 ID 生成器
services.AddSingleton<IMsgIdGenerator, CustomMsgIdGenerator>();
// 替换存储 ID 生成器
services.AddSingleton<IIdGenerator, CustomIdGenerator>();
// 替换序列化器
services.AddSingleton<IMessageSerializer, CustomMessageSerializer>();
services.AddEventBus()
.AddRelationDb(options => options.UseConnection(DataType.MySql, "..."))
.AddRabbitMQ(r => { /* ... */ });
由于默认实现使用 TryAdd 注册,先注册的自定义实现不会被覆盖。也可以在 AddEventBus 之后注册,但需注意使用 AddSingleton 而非 TryAddSingleton。
常见扩展场景
自定义事件名称规则
public class CustomNameRuler : IEventNameRuler, IEventHandlerNameRuler
{
public string GetName(Type type)
{
// 自定义命名规则,如 snake_case
return type.Name.ToSnakeCase();
}
}
services.AddSingleton<IEventNameRuler, CustomNameRuler>();
services.AddSingleton<IEventHandlerNameRuler, CustomNameRuler>();
自定义消息序列化
public class NewtonsoftJsonSerializer : IMessageSerializer
{
public string Serialize<T>(T obj) => JsonConvert.SerializeObject(obj);
public T Deserialize<T>(string json) => JsonConvert.DeserializeObject<T>(json);
public byte[] SerializeToBytes<T>(T obj) => Encoding.UTF8.GetBytes(Serialize(obj));
}
services.AddSingleton<IMessageSerializer, NewtonsoftJsonSerializer>();