插件系统
说明
- 插件是对TouchSocket产品的横向扩展。
产品特点
- 简单易用。
- 易扩展。
产品应用场景
- TCP基础使用场景。
- 自定义协议解析场景。
插件特性
【多线程并发】 插件的所有触发,均是同一实例,所以在服务器运行时,几乎都是并发触发的,所以应当考虑并发问题。
【插件先行】 当启用插件时,插件的触发仅次于方法重写,而优于事件。
【执行顺序】 每个插件都有一个Order属性,该属性表示该插件的执行顺序,数值大,越提前执行(Order在Add之前生效,后续修改无效)。
【中断传递】 当某个插件在响应时,如果设置e.Handled=true,则该数据将不会再触发后续的插件、事件、重写方法。
用户自定义插件
用户通过实现框架预设的插件接口,即可接收相应的触发。每个组件都有详细的插件支持说明。
例如:ITcpPlugin、ITokenPlugin、IProtocolPlugin等。
系统自定义插件
当各位朋友使用TouchSocket封装自己的dll时,可能需要一些定义插件。那么这个需求TouchSocket也能满足大家。
例如:实现基于TCP的特殊信息自定义插件,当收到字母‘A’时,希望触发实现IAPlugin接口插件的GoToA方法。
具体操作如下:
- 声明IAPlugin接口,继承IPlugin。
- 声明GoToA接口方法(该方法必须两个参数,第一参数无要求,一般为触发主体,第二参数必须继承自TouchSocketEventArgs)。
- 在合适时候,判断当前配置是否支持插件,然后使用服务器或客户端的PluginsManager属性调用Raise方法,此处的泛型(IAPlugin)必须为接口类型。
public interface IAPlugin : IPlugin
{
void GoToA(ITcpClientBase client,TouchSocketEventArgs e);
}
public class MyTClient : TcpClient
{
protected override void HandleReceivedData(ByteBlock byteBlock, IRequestInfo requestInfo)
{
if (this.UsePlugin)
{
if (byteBlock.ToString()=="A")
{
this.PluginsManager.Raise<IAPlugin>("GoToA",this,new TouchSocketEventArgs());
}
}
}
}