Skip to content

Extensibility

licas.li edited this page Jun 22, 2026 · 2 revisions

扩展接口

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>();

Clone this wiki locally