插件系统
插件系统是 SharwAPI 的灵魂。本文将深入探讨插件的加载机制、隔离性以及生命周期管理。
插件加载机制
宿主框架通过 LoadPlugins 方法动态加载插件。该过程包含以下关键步骤:
- 目录扫描: 检查应用程序根目录下的
Plugins文件夹。 - 程序集加载: 遍历所有
.dll文件,使用Assembly.LoadFrom加载程序集。 - 类型发现: 在加载的程序集中查找实现了
IApiPlugin接口且非抽象类。 - 实例化: 使用
Activator.CreateInstance创建插件实例。
依赖管理
目前 SharwAPI 采用简单的加载策略。所有插件共享同一个加载上下文(Load Context)。这意味着如果两个插件依赖了同一个第三方库的不同版本,可能会发生版本冲突。建议插件开发者尽量减少外部依赖,或使用统一的基础库版本。
插件隔离性
虽然所有插件运行在同一个进程和同一个 DI 容器中(物理上不隔离),但为了防止相互干扰,应遵循命名规范,在逻辑层面人为地划分界限:
- 服务隔离: 建议使用插件名作为服务命名的前缀。
- 路由隔离: 强烈建议使用
app.MapGroup($"/{Name}")隔离 URL 空间。 - 配置隔离: 在
appsettings.json中使用插件名作为根节点。
生命周期管理
插件实例本身是作为 单例 (Singleton) 注册到 DI 容器中的。这意味着:
IApiPlugin的实现类在整个应用生命周期中只有一个实例。- 插件的状态(如果有)是全局共享的,需注意线程安全。
关键生命周期钩子
- RegisterServices:
- 时机: 应用构建前。
- 作用: 注册依赖。
- Configure:
- 时机: 应用构建后,启动前。
- 作用: 插入中间件到请求处理流程中。
- RegisterRoutes:
- 时机: 中间件配置后,启动前。
- 作用: 暴露接口。