---
id: pluginsmanager
title: 插件系统
---

## 说明
- 插件是对TouchSocket产品的横向扩展。

## 产品特点

- 简单易用。
- 易扩展。

## 产品应用场景

- TCP基础使用场景。
- 自定义协议解析场景。

## 插件特性
【多线程并发】
插件的所有触发，均是同一实例，所以在服务器运行时，几乎都是并发触发的，所以应当考虑并发问题。

【插件先行】
当启用插件时，插件的触发**仅次于**方法重写，而**优于**事件。

【执行顺序】
每个插件都有一个**Order**属性，该属性表示该插件的执行顺序，数值大，越提前执行（Order在Add之前生效，后续修改无效）。

【中断传递】
当某个插件在响应时，如果设置e.Handled=true,则该数据将**不会**再触发后续的插件、事件、重写方法。

## 用户自定义插件
用户通过实现框架预设的插件接口，即可接收相应的触发。每个组件都有详细的插件支持说明。

例如：**ITcpPlugin**、**ITokenPlugin**、**IProtocolPlugin**等。

## 系统自定义插件
当各位朋友使用TouchSocket封装自己的dll时，可能需要一些定义插件。那么这个需求TouchSocket也能满足大家。
> 例如：实现基于TCP的特殊信息自定义插件，当收到字母‘A’时，希望触发实现IAPlugin接口插件的GoToA方法。

具体操作如下：

1. 声明IAPlugin接口，继承**IPlugin**。
2. 声明GoToA接口方法（该方法必须**两个**参数，第一参数无要求，一般为触发主体，第二参数**必须继承**自**TouchSocketEventArgs**）。
3. 在合适时候，判断当前配置是否支持插件，然后使用服务器或客户端的**PluginsManager**属性调用**Raise**方法，此处的泛型（**IAPlugin**）必须为接口类型。

```csharp
public interface IAPlugin : IPlugin
{
    void GoToA(ITcpClientBase client,TouchSocketEventArgs e);
}
```

```csharp
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());
            }
        }
    }
}
```
