You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
6.4 KiB
6.4 KiB
插件加载机制
**本文档引用的文件** - [Program.cs](file://aspnet-core/services/LY.MicroService.Applications.Single/Program.cs) - [MicroServiceApplicationsSingleModule.cs](file://aspnet-core/services/LY.MicroService.Applications.Single/MicroServiceApplicationsSingleModule.cs) - [AbpCommonModule.cs](file://aspnet-core/framework/common/LINGYUN.Abp.Core/AbpCommonModule.cs) - [DirectoryHelper.cs](file://aspnet-core/framework/common/Volo.Abp.IO/DirectoryHelper.cs)目录
项目结构
该项目采用模块化架构,核心插件机制通过ABP框架的模块系统实现。主要结构包括:
- aspnet-core: 包含框架核心组件、迁移脚本、模块和微服务
- modules: 各功能模块,如账户、审计、缓存管理等
- services: 主要服务应用,如应用程序单实例、认证服务器等
- gateways: 网关服务
- starter: 启动脚本集合
graph TD
A[宿主应用] --> B[插件目录]
B --> C[模块1]
B --> D[模块2]
B --> E[模块N]
A --> F[ABP模块系统]
F --> G[插件源管理]
F --> H[依赖解析]
F --> I[生命周期管理]
图示来源
- Program.cs
本节来源
- Program.cs
插件发现与加载
插件发现与加载机制基于ABP框架的插件系统,通过在宿主应用启动时配置插件源来实现。
插件发现
插件发现通过PlugInSources.AddFolder方法实现,该方法将指定目录下的所有程序集作为插件源:
var pluginFolder = Path.Combine(Directory.GetCurrentDirectory(), "Modules");
DirectoryHelper.CreateIfNotExists(pluginFolder);
options.PlugInSources.AddFolder(pluginFolder, SearchOption.AllDirectories);
此代码在Program.cs中配置,将当前目录下的"Modules"文件夹设置为插件目录,并递归搜索所有子目录中的程序集。
插件加载
插件加载由ABP框架自动完成,当应用启动时,框架会扫描所有配置的插件源,加载其中的模块。加载过程包括:
- 扫描插件目录中的所有程序集
- 查找继承自
AbpModule的模块类 - 按照依赖关系排序模块
- 依次初始化每个模块
flowchart TD
A[应用启动] --> B[配置插件源]
B --> C[扫描插件目录]
C --> D[发现模块程序集]
D --> E[解析模块依赖]
E --> F[按依赖顺序初始化]
F --> G[完成插件加载]
图示来源
- Program.cs
本节来源
- Program.cs
模块化加载策略
模块化加载策略通过ABP框架的模块系统实现,确保各个功能模块能够独立开发、测试和部署。
模块定义
每个模块通过继承AbpModule类来定义,例如:
public class MicroServiceApplicationsSingleModule : AbpModule
{
// 模块配置
}
模块依赖
模块之间的依赖关系通过DependsOn特性声明:
[DependsOn(typeof(AbpAuditLoggingEntityFrameworkCoreModule))]
public class MicroServiceApplicationsSingleModule : AbpModule
{
// 模块实现
}
加载顺序
模块加载顺序由依赖关系决定,ABP框架会自动解析依赖图并按拓扑排序加载模块。
graph TD
A[核心模块] --> B[数据访问模块]
B --> C[业务逻辑模块]
C --> D[API接口模块]
D --> E[宿主应用]
图示来源
- MicroServiceApplicationsSingleModule.cs
本节来源
- MicroServiceApplicationsSingleModule.cs
依赖注入集成
插件系统与ABP框架的依赖注入容器深度集成,确保插件中的服务能够正确注册和解析。
服务注册
在模块的ConfigureServices方法中注册服务:
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddTransient<IMyService, MyService>();
}
依赖解析
ABP框架的依赖注入容器会自动解析插件中的依赖关系,包括跨插件的依赖。
生命周期管理
支持多种服务生命周期:
- Singleton: 单例模式,整个应用生命周期内只创建一次
- Scoped: 作用域模式,每个请求创建一次
- Transient: 瞬态模式,每次请求都创建新实例
classDiagram
class AbpModule {
+ConfigureServices(ServiceConfigurationContext context)
+OnApplicationInitialization(ApplicationInitializationContext context)
+OnApplicationShutdown(ApplicationShutdownContext context)
}
class ServiceConfigurationContext {
+IServiceCollection Services
}
class IServiceProvider {
+GetService(Type serviceType)
+GetServices(Type serviceType)
}
AbpModule --> ServiceConfigurationContext : "配置"
ServiceConfigurationContext --> IServiceProvider : "构建"
图示来源
- AbpCommonModule.cs
本节来源
- AbpCommonModule.cs
生命周期同步机制
插件与宿主应用的生命周期通过ABP模块系统的生命周期事件实现同步。
初始化阶段
sequenceDiagram
participant Host as 宿主应用
participant Module as 插件模块
participant DI as 依赖注入容器
Host->>Host : 创建应用构建器
Host->>Host : 配置插件源
Host->>Host : 扫描并加载插件
Host->>Module : 调用ConfigureServices
Module->>DI : 注册服务
DI-->>Module : 确认注册
Host->>Host : 构建应用
Host->>Module : 调用OnApplicationInitialization
Module->>Module : 初始化资源
Host->>Host : 启动应用
关闭阶段
当应用关闭时,会按相反顺序调用OnApplicationShutdown方法,确保资源正确释放。
###