@@ -11,11 +11,13 @@ internal class ModuleManager(ILogger<ModuleManager> logger) : IModuleManager
11
11
public required IServiceCollection HostServices { get ; init ; }
12
12
public required IServiceProvider Activator { get ; init ; }
13
13
public List < Assembly > LoadedAssemblies { get ; } = [ ] ;
14
+ private readonly List < Assembly > _removedAssemblies = [ ] ;
14
15
15
16
public async Task RegisterModulesAsync ( )
16
17
{
17
18
LoadModules ( ) ;
18
19
LoadedAssemblies . ForEach ( RegisterModule ) ;
20
+ _removedAssemblies . ForEach ( asm => LoadedAssemblies . Remove ( asm ) ) ;
19
21
20
22
// 调用所有模块的 OnAllLoaded 方法
21
23
var initTasks = _loadedModules . Select ( module =>
@@ -60,34 +62,43 @@ public void LoadModule(Assembly assembly)
60
62
61
63
private void RegisterModule ( Assembly assembly )
62
64
{
63
- var moduleTypes = assembly . GetTypes ( )
64
- . Where ( t => typeof ( IModule ) . IsAssignableFrom ( t ) && t is { IsAbstract : false , IsInterface : false } )
65
- . ToList ( ) ;
66
-
67
- switch ( moduleTypes . Count )
65
+ try
68
66
{
69
- case 0 :
70
- logger . LogWarning ( "No module implementation found in assembly {Assembly}" , assembly . FullName ) ;
71
- return ;
72
- case > 1 :
73
- throw new InvalidOperationException (
74
- $ "Multiple module implementations found in assembly { assembly . FullName } . Only one implementation of IModule is allowed per assembly.") ;
75
- }
67
+ var moduleTypes = assembly . GetTypes ( )
68
+ . Where ( t => typeof ( IModule ) . IsAssignableFrom ( t ) && t is { IsAbstract : false , IsInterface : false } )
69
+ . ToList ( ) ;
70
+
71
+ switch ( moduleTypes . Count )
72
+ {
73
+ case 0 :
74
+ logger . LogWarning ( "No module implementation found in assembly {Assembly}" , assembly . FullName ) ;
75
+ return ;
76
+ case > 1 :
77
+ throw new InvalidOperationException (
78
+ $ "Multiple module implementations found in assembly { assembly . FullName } . Only one implementation of IModule is allowed per assembly.") ;
79
+ }
76
80
77
- var moduleType = moduleTypes [ 0 ] ;
78
- // 创建模块实例并添加到已加载模块列表
79
- var module = ( IModule ) ActivatorUtilities . CreateInstance ( Activator , moduleType ) ;
80
- _loadedModules . Add ( module ) ;
81
+ var moduleType = moduleTypes [ 0 ] ;
82
+ // 创建模块实例并添加到已加载模块列表
83
+ var module = ( IModule ) ActivatorUtilities . CreateInstance ( Activator , moduleType ) ;
84
+ _loadedModules . Add ( module ) ;
81
85
82
- // 注册为 IModule
83
- HostServices . AddSingleton ( module ) ;
86
+ // 注册为 IModule
87
+ HostServices . AddSingleton ( module ) ;
84
88
85
- if ( module is IUiModule uiModule )
89
+ if ( module is IUiModule uiModule )
90
+ {
91
+ HostServices . AddSingleton ( uiModule ) ;
92
+ }
93
+
94
+ logger . LogInformation ( "Registered module {ModuleId} of type {ModuleType}" , module . ModuleId ,
95
+ moduleType . FullName ) ;
96
+ }
97
+ catch ( Exception ex )
86
98
{
87
- HostServices . AddSingleton ( uiModule ) ;
99
+ _removedAssemblies . Add ( assembly ) ;
100
+ logger . LogError ( ex , "Error when load assembly" ) ;
88
101
}
89
-
90
- logger . LogInformation ( "Registered module {ModuleId} of type {ModuleType}" , module . ModuleId , moduleType . FullName ) ;
91
102
}
92
103
93
104
public Result < IModule > GetModule ( string moduleId , Version ? minVersion = null , Version ? maxVersion = null )
0 commit comments