Skip to content

Commit 50a61e5

Browse files
author
Shoming
committed
fix: 完善了日志级别,修复了文件占用问题,添加了错误处理
1 parent d763870 commit 50a61e5

File tree

3 files changed

+48
-33
lines changed

3 files changed

+48
-33
lines changed

Runtime/Pages/ModuleManagement.razor.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,13 @@ private async Task InstallModuleFromFile(InputFileChangeEventArgs e)
6666
{
6767
// 保存上传的文件
6868
await using var fileStream = file.OpenReadStream(maxAllowedSize: 1024 * 1024 * 1024); // 1GB max
69-
await using var fs = new FileStream(tempFile, FileMode.Create);
70-
await fileStream.CopyToAsync(fs);
69+
await using (var fs = new FileStream(tempFile, FileMode.Create))
70+
{
71+
await fileStream.CopyToAsync(fs);
72+
}
7173

7274
// 安装模块
73-
var success = InstallModuleFromZipFile(tempFile);
74-
if (success)
75+
if (InstallModuleFromZipFile(tempFile))
7576
{
7677
_ = MessageService.Success("插件安装成功,请重启应用以加载新安装的插件");
7778
}

Runtime/Program.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,8 @@
44
using Quantum.Sdk;
55
using Quantum.Sdk.Extensions;
66
using Quantum.Sdk.Services;
7-
8-
9-
#if RELEASE
107
using Serilog;
118
using Serilog.Events;
12-
#endif
139

1410
// 处理待安装的模块
1511
HandlePendingModules();
@@ -29,16 +25,23 @@
2925
.Enrich.FromLogContext()
3026
.WriteTo.File(
3127
Path.Combine("logs", $"log_{DateTime.Now:yyyy-MM-dd.HH.mm.ss}.txt"),
32-
outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff}] [{Level:u3}] [{SourceContext}] [{FilePath}:{LineNumber}] {Message:lj}{NewLine}{Exception}",
28+
outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff}] [{Level:u3}] [{SourceContext}] {Message:lj}{NewLine}{Exception}",
3329
rollingInterval: RollingInterval.Day,
3430
fileSizeLimitBytes: 10 * 1024 * 1024)
3531
.CreateLogger();
32+
#else
33+
Log.Logger = new LoggerConfiguration()
34+
.MinimumLevel.Debug()
35+
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
36+
.Enrich.FromLogContext()
37+
.WriteTo.Console(outputTemplate: "[{Level:u3}] [{SourceContext}] {Message:lj}{NewLine}{Exception}")
38+
.CreateLogger();
39+
#endif
3640

3741
builder.Host.UseSerilog();
38-
#endif
3942

4043
var preloadServices = new ServiceCollection();
41-
preloadServices.AddLogging()
44+
preloadServices.AddLogging(logBuilder => logBuilder.AddSerilog())
4245
.AddSingleton<InjectedCodeManager>()
4346
.AddSingleton(sp =>
4447
{

Runtime/Services/ModuleManager.cs

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ internal class ModuleManager(ILogger<ModuleManager> logger) : IModuleManager
1111
public required IServiceCollection HostServices { get; init; }
1212
public required IServiceProvider Activator { get; init; }
1313
public List<Assembly> LoadedAssemblies { get; } = [];
14+
private readonly List<Assembly> _removedAssemblies = [];
1415

1516
public async Task RegisterModulesAsync()
1617
{
1718
LoadModules();
1819
LoadedAssemblies.ForEach(RegisterModule);
20+
_removedAssemblies.ForEach(asm => LoadedAssemblies.Remove(asm));
1921

2022
// 调用所有模块的 OnAllLoaded 方法
2123
var initTasks = _loadedModules.Select(module =>
@@ -60,34 +62,43 @@ public void LoadModule(Assembly assembly)
6062

6163
private void RegisterModule(Assembly assembly)
6264
{
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
6866
{
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+
}
7680

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);
8185

82-
// 注册为 IModule
83-
HostServices.AddSingleton(module);
86+
// 注册为 IModule
87+
HostServices.AddSingleton(module);
8488

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)
8698
{
87-
HostServices.AddSingleton(uiModule);
99+
_removedAssemblies.Add(assembly);
100+
logger.LogError(ex, "Error when load assembly");
88101
}
89-
90-
logger.LogInformation("Registered module {ModuleId} of type {ModuleType}", module.ModuleId, moduleType.FullName);
91102
}
92103

93104
public Result<IModule> GetModule(string moduleId, Version? minVersion = null, Version? maxVersion = null)

0 commit comments

Comments
 (0)