Skip to content

插件系统

插件系统是 SharwAPI 的灵魂。本文将深入探讨插件的加载机制、隔离性以及生命周期管理。

插件加载机制

宿主框架通过 LoadPlugins 方法动态加载插件。该过程包含以下关键步骤:

  1. 目录扫描: 检查应用程序根目录下的 Plugins 文件夹。
  2. 程序集加载: 遍历所有 .dll 文件,使用 Assembly.LoadFrom 加载程序集。
  3. 类型发现: 在加载的程序集中查找实现了 IApiPlugin 接口且非抽象类。
  4. 实例化: 使用 Activator.CreateInstance 创建插件实例。

依赖管理

目前 SharwAPI 采用简单的加载策略。所有插件共享同一个加载上下文(Load Context)。这意味着如果两个插件依赖了同一个第三方库的不同版本,可能会发生版本冲突。建议插件开发者尽量减少外部依赖,或使用统一的基础库版本。

插件隔离性

虽然所有插件运行在同一个进程和同一个 DI 容器中(物理上不隔离),但为了防止相互干扰,应遵循命名规范,在逻辑层面人为地划分界限:

  • 服务隔离: 建议使用插件名作为服务命名的前缀。
  • 路由隔离: 强烈建议使用 app.MapGroup($"/{Name}") 隔离 URL 空间。
  • 配置隔离: 在 appsettings.json 中使用插件名作为根节点。

生命周期管理

插件实例本身是作为 单例 (Singleton) 注册到 DI 容器中的。这意味着:

  • IApiPlugin 的实现类在整个应用生命周期中只有一个实例。
  • 插件的状态(如果有)是全局共享的,需注意线程安全。

关键生命周期钩子

  1. RegisterServices:
    • 时机: 应用构建前。
    • 作用: 注册依赖。
  2. Configure:
    • 时机: 应用构建后,启动前。
    • 作用: 插入中间件到请求处理流程中。
  3. RegisterRoutes:
    • 时机: 中间件配置后,启动前。
    • 作用: 暴露接口。