写出第一个插件
# 写出第一个插件
在这之前先要了解以下 HyperaiShell 的插件机制。
# 阅读本章你需要了解...
(为什么链接打不开:因为你没联网。为什么链接给的不是百度:因为百度搜索是个笑话。为什么不是谷歌:因为部分人会回来问“为什么链接打不开”)。
# 是的,你已经知道这一节标题该叫什么了
(什么?你不不知道?这一章标题叫“了解 HyperaiShell 插件机制”...)
HyperaiShell 会构建一个 Hyperai Application,为了扩展这个 app,HyperaiShell 将插件引入并适时调用,达到插件干预 app 的目的,也最终达到插件实现功能的目的。
而 HyperaiShell 所谓的插件,广义上指包含额外内容的 nupkg 包,里面甚至不一定需要有可执行代码;狭义上则指某个程序集中实现了 PluginBase
的类。这个类会作为广义插件的入口,来引入所谓的可执行代码。下文中这个类会被称作插件入口类。
放心,即使没有这个类,插件包中的可执行代码依旧会被加载,但缺少互动的时机。至少在当前版本中,没有插件入口类将无法添加 Bot 和自动搜索的 Unit (没有插件入口类的程序集不会触发 Unit 搜索)。而在所有版本中,没有插件入口类 HyperaiShell 甚至不会给这个包一个私有空间(Space,包含数据库访问和配置文件访问等)。
可以这么说,没有实现了 PluginBase
的插件入口类的程序集以及包含了这个程序集的包不会被 HyperaiShell 当作插件对待,至少得不到“插件权”。
对于诸如仅包含适配器的包,虽然它不会被当作插件对待,但其中的适配器代码依旧会被加载,毕竟适配器并不需要所谓的“插件权”。
提示
一个程序集中只有第一个被找到的插件入口类才会被读取,并用来代表这个程序集。
注意
但当情况变成一个包里含有多个程序集都包含插件入口类,那么抱歉,它们将会共享私有空间。而这通常不是作者所希望发生的。所以在发布插件之前请确保包里面只有一个程序集具有插件入口类。
DETAILS
对于上一个警告提到的问题,最好的做法是更新插件加载机制,来避免包中的多个插件入口类都会被加载的问题,但是作者太懒了。除非你把这个问题挂出来(指发 issue),否则作者看心情修复。
# 实现插件入口类(PluginBase)
一个插件入口类通常具有以下特征
- 实现
PluginBase
抽象类 - 公开(public),非抽象(abstract)
- 至于类名,我通常叫它
PluginEntry
实现 PluginBase
会引入 PluginBase.Context:PluginContext
和 PluginBase.Meta:PluginMeta
两个属性,PluginBase.ConfigureBots
和 PluginBase.ConfigureServices
两个方法。
两个方法签名如下所示
void ConfigureBots(IBotCollectionBuilder bots );
void ConfigureServices(IServiceCollection services);
2
ConfigureServices
用来添加配置插件所使用的服务。其中 IServiceCollection
属于 Microsft.Extensions.DenpendencyInjection
包,如何使用及依赖注入相关知识应当作为提前预习内容。
ConfigureBots
用来添加 Bot。这里提到的 Bot 不是通常做聊天机器人时所认知的 Bot。此处 Bot 是 HyperaiShell 中特别地用来接收并处理各类事件的功能聚合类,具有事件处理能力并通常实现某一部分特定功能。有关于 HyperaiShell 的 Bot 功能请参阅对应章节。