当前位置: 首页 > article >正文

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

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

        • 一、概述
        • 二、产品特点
        • 三、应用场景
        • 四、与传统事件/委托的区别
        • 五、创建插件
          • 5.1 定义插件接口及事件类
          • 5.2 实现插件接口
        • 六、订阅插件
          • 6.1 创建插件管理器
          • 6.2 添加订阅插件
            • 6.2.1 按类型添加
            • 6.2.2 按实例添加
            • 6.2.3 按委托添加
        • 七、触发插件
        • 八、插件特性
        • 九、提升插件性能
          • 9.1 性能测试
          • 9.2 注册委托
          • 9.3 源生成插件
        • 十、示例代码仓库

一、概述

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 源生成插件

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


十、示例代码仓库
  • GitHub: https://github.com/RRQM/TouchSocket
  • Gitee: https://gitee.com/rrqm_Home/touchsocket

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


http://www.kler.cn/a/592661.html

相关文章:

  • k8s--集群内的pod调用集群外的服务
  • 穿越是时空之门(java)
  • 《深度学习》—— YOLOv1
  • 突破时空边界:Java实时流处理中窗口操作与时间语义的深度重构
  • 汇编移位指令
  • BERT系列模型
  • 解决下载npm 缓存出现的问题
  • JAVA并发-volatile底层原理
  • opencv初步学习——图像处理2
  • Day67 | 灵神 | 二分查找:统计公平数对的数目
  • SQLMesh系列教程:SQLMesh虚拟数据环境
  • 台式机电脑组装---电源
  • 【C++】STL(1) - 序列容器
  • Java设计模式之模板方法模式(Template Method Pattern)
  • Redis 三主三从集群部署的完整方案
  • ASP3605同步降压调节器——满足汽车电子严苛要求的电源芯片方案
  • 进程间通信(1)——管道
  • 数据结构知识点1
  • excel文件有两列,循环读取文件两列赋值到字典列表。字典的有两个key,分别为question和answer。将最终结果输出到json文件
  • 使用STM32CubeMX+DMA+空闲中断实现串口接收和发送数据(STM32G070CBT6)