Skip to content

插件

插件是整个项目中最重要的角色,因为API本体并不具备任何实际的业务代码,功能全部由插件负责。在本章中,我们将会讲解插件系统的内容,并引导你开发一个你自己的插件

术语统一

在接下来的内容中,为了预防理解困难,再次介绍各术语和其对应的项目

  • CoreAPIAPI本体sharwapi.Core :均指代 API框架本体 ,仅包含负责插件加载、路由注册等底层任务代码
  • Contracts接口层Contracts.Core : 均指代 定义插件与核心框架之间通信的接口 ,插件需要实现 IApiPlugin 接口,核心框架通过此接口与插件进行交互

你需要知道的

插件本质是一个个独立的 .dll 文件,这些dll文件能被认为是API框架的插件,是因为实现了 Contracts.CoreIApiPlugin 这个接口

Contracts.Core 中规定了插件必须实现的接口成员,即:

  • Name(string)
  • DisplayName(string)
  • Version(string)
  • RegisterServices(IServiceCollection services, IConfiguration configuration)(funtion)
  • Configure(WebApplication app)(funtion)
  • RegisterRoutes(IEndpointRouteBuilder app, IConfiguration configuration)(funtion)
  • RegisterManagementEndpoints(IEndpointRouteBuilder managementGroup)(funtion)

各接口成员介绍

  1. Name
    • 这是插件的内部全局唯一标识符,在API本体加载时将会用此名称进行日志输出,插件列表展示等(在接下来的内容中将用 {Name} 表示)
    • 规范 : 由全小写字母、数字组成的字符串,不含空格或特殊字符
    • 示例 : "apimgr","guard"
  2. DisplayName
    • 这是插件的显示名称,用于在插件市场和管理界面中展示,具有人类友好等特征(在接下来的内容中将用 {DisplayName} 表示)
    • 示例 : "API Manager","Route Guard"
  3. Version
    • 这是插件的版本号(在接下来的内容中将用 {Version} 表示)
    • 规范 : 必须 遵守 语义化版本号 2.0.0
    • 示例 : "0.1.0","1.0.0-alpha","1.0.0+20130313144700"
  4. RegisterServices :
    • 该方法是插件向全局依赖注入容器 (DI Container) 注册其所需服务的入口
    • 可用于注册插件的自定义服务(如 HttpClient 客户端、数据库上下文 DbContext、配置对象 PluginSettings 等),也可用于通过 IConfiguration 直接获取配置(如 "PluginSettings"

    禁止操作

    切勿在此方法中调用 services.BuildServiceProvider() 这会创建独立的容器副本,导致单例失效和内存泄漏。请直接使用参数中的 configurationservices

  5. Configure
    • 该方法允许插件向应用程序的请求处理管道 (Middleware Pipeline) 中注入自定义的中间件
    • 可用于在请求到达路由之前执行的逻辑,例如身份验证、授权检查、请求日志记录
  6. RegisterRoutes
    • 该方法是插件注册其 API 端点(路由)的地方
    • 规范操作 : 使用 app.MapGroup("/prefix") 来为插件的所有路由设置一个统一的 URL 前缀,后再使用ASP.NET Core Minimal API 提供的 MapGet, MapPost, MapPut, MapDelete 等方法来注册具体的 API 端点(路由)
  7. RegisterManagementEndpoints
    • 该方法用于注册插件的管理端点
    • 注意 : 该方法在接口中已有默认实现(返回 "Not Applicable"),若插件不需要管理端点可忽略此方法

开发环境设置

如果你想要开发插件,那么配置开发环境是必不可少的,你需要按照下列列表中配置开发环境

并按照 手动构建 一节中拉取 API本体接口层

随后在解决方案目录下执行如下命令新建你的插件,添加到解决方案中并添加对 接口层 的引用

规范开发

为了插件的规范开发和方便索引,你的插件项目名需要为 sharwapi.Plugin.{Name},其中的 {Name} 为你插件的 唯一标识符,比如 sharwapi.Plugin.apimgr

bash
$ dotnet new classlib -n sharwapi.Plugin.{Name}

$ dotnet sln add sharwapi.Plugin.{Name}/sharwapi.Plugin.{Name}.csproj

$ dotnet add sharwapi.Plugin.{Name}/sharwapi.Plugin.{Name}.csproj reference sharwapi.Contracts.Core/sharwapi.Contracts.Core.csproj

随后你便可以开始你的插件开发,但你可以参考如下内容

插件开发规范

新建插件项目后,将 Class1.cs 删除,并新建 {Name}Plugin.cs ,在里面写入你插件的 Name,DisplayName 等信息

若需要获取配置,可以新建 {Name}Settings.cs 用于绑定配置项

在后续的内容中...

在本章接下来内容中,都默认你已经看过本文内容,并且不会重复提及本文已经提到的内容