深入解析 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 插件系统的使用有所帮助!