深入解析 TouchSocket 插件系统架构与实践

发布于:2025-03-21 ⋅ 阅读:(31) ⋅ 点赞:(0)

一、概述

TouchSocket 的插件系统是一组能够实现多播订阅、可中断的触发器,其核心功能是提供类似事件或委托的通知机制。该系统的设计灵感来源于 AspNetCore 的中间件,不仅具备与中间件相似的使用体验,还提供了更高的灵活性和自由度。

二、产品特点
  • 简单易用:开发者可以轻松定义和实现插件。
  • 易扩展:支持继承、扩展以及依赖注入,便于构建模块化功能。
三、应用场景

适用于所有需要事件或委托通知的场景,例如:

  • 数据处理管道
  • 中间件逻辑
  • 模块化功能开发
四、与传统事件/委托的区别
特性 插件系统 传统事件/委托
订阅方是否需要知道被订阅方 不需要 需要
是否支持中断 支持 不支持
是否支持回调 支持 不支持
是否支持继承 支持 不支持
是否支持依赖注入 支持 不支持
五、创建插件
5.1 定义插件接口及事件类
public class MyPluginEventArgs : PluginEventArgs
{
    public string Words { get; set; }
}

public interface ISayPlugin : IPlugin
{
    Task Say(object sender, MyPluginEventArgs e);
}
5.2 实现插件接口

推荐继承 PluginBase 类以简化实现过程:

public class SayHelloPlugin : PluginBase, ISayPlugin
{
    public async Task Say(object sender, MyPluginEventArgs e)
    {
        Console.WriteLine($"{this.GetType().Name}------Enter");
        if (e.Words == "hello")
        {
            Console.WriteLine($"{this.GetType().Name}------Say");
            return;
        }
        await e.InvokeNext();
        Console.WriteLine($"{this.GetType().Name}------Leave");
    }
}
六、订阅插件
6.1 创建插件管理器
IPluginManager pluginManager = new PluginManager(new Container())
{
    Enable = true
};
6.2 添加订阅插件
6.2.1 按类型添加
pluginManager.Add<SayHelloPlugin>();
6.2.2 按实例添加
pluginManager.Add(new SayHelloPlugin());
6.2.3 按委托添加
pluginManager.Add(typeof(ISayPlugin), () => 
{
    Console.WriteLine("在Action1中获得");
});
七、触发插件
await pluginManager.RaiseAsync(typeof(ISayPlugin), new object(), new MyPluginEventArgs()
{
    Words = Console.ReadLine()
});
八、插件特性
  • 中断传递:通过设置 e.Handled = true 或不调用 e.InvokeNext(),可以中断后续插件的执行。
九、提升插件性能
9.1 性能测试

在这里插入图片描述

9.2 注册委托

通过注册委托提升性能:

pluginsManager.Add(typeof(ISayPlugin), this.Say);
9.3 源生成插件

使用源生成器自动生成委托调用,减少运行时开销。


十、示例代码仓库

希望本文对您理解 TouchSocket 插件系统的使用有所帮助!