Repository navigation
Expand file tree
/
Copy pathPlugin.cs
More file actions
71 lines (59 loc) · 2.91 KB
/
Copy pathPlugin.cs
File metadata and controls
71 lines (59 loc) · 2.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using SecRandom.Core.Abstraction;
using SecRandom.Core.Extensions.Registry;
using SecRandom.ExamplePlugin.Views.SettingsPages;
using SecRandom.PluginSdk;
namespace SecRandom.ExamplePlugin;
/// <summary>
/// 插件入口。
/// <para>
/// 宿主通过 <c>manifest.yml</c> 的 <c>entranceAssembly</c> 找到入口程序集,再取其中第一个非抽象的
/// <see cref="PluginBase" /> 实现并实例化。这个类必须有一个公开无参构造函数。
/// </para>
/// <para>
/// 本示例只做一件事:注册一个展示插件自身信息的设置页。
/// </para>
/// </summary>
public sealed class Plugin : PluginBase
{
/// <summary>插件设置页的页面 id,必须全局唯一。</summary>
public const string SettingsPageId = "plugin.com.example.plugin.settings";
private PluginStateStore? _stateStore;
/// <summary>演示用的插件状态,设置页会读取它。</summary>
public PluginState State { get; private set; } = new();
/// <summary>插件配置目录下的状态文件路径,便于排查问题。</summary>
public string StateFilePath => _stateStore?.FilePath ?? string.Empty;
/// <summary>宿主日志,失败时返回 null(日志不是插件的必需依赖)。</summary>
private static ILogger<Plugin>? Logger => IAppHost.TryGetService<ILogger<Plugin>>();
public override void Initialize(HostBuilderContext context, IServiceCollection services)
{
// Info / PluginConfigFolder 由宿主在调用 Initialize 之前赋值。
_stateStore = new PluginStateStore(PluginConfigFolder);
State = _stateStore.Load();
State.LoadCount++;
State.LastMessage = $"插件已加载(第 {State.LoadCount} 次)";
_stateStore.Save(State);
// 注册设置页:页面类型上必须带 [PageInfo],页面实例会由依赖注入解析,
// 因此页面构造函数可以注入宿主服务。第二个参数是导航项显示的文本。
services.AddSettingsPage<ExampleSettingsPage>("SecRandom 示例插件");
// 需要后台服务时直接注册即可,宿主会随应用一起构建 Host。
// services.AddHostedService<MyPluginHostedService>();
}
public override void OnAppStarted()
{
// 此时 Host 已构建完成,可以解析宿主服务。
Logger?.LogInformation("示例插件已启动:设置页 {SettingsPageId} 已注册。", SettingsPageId);
}
public override void OnAppStopping()
{
State.LastMessage = "应用正在退出";
_stateStore?.Save(State);
}
public override ValueTask DisposeAsync()
{
// 本示例没有额外申请宿主资源(窗口、服务等),因此这里不需要释放任何东西。
return ValueTask.CompletedTask;
}
}