写出第一个插件

... 大约 3 分钟

# 写出第一个插件

在这之前先要了解以下 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:PluginContextPluginBase.Meta:PluginMeta 两个属性,PluginBase.ConfigureBotsPluginBase.ConfigureServices 两个方法。

两个方法签名如下所示

void ConfigureBots(IBotCollectionBuilder bots );
void ConfigureServices(IServiceCollection services);
1
2

ConfigureServices 用来添加配置插件所使用的服务。其中 IServiceCollection 属于 Microsft.Extensions.DenpendencyInjection 包,如何使用及依赖注入相关知识应当作为提前预习内容。

ConfigureBots 用来添加 Bot。这里提到的 Bot 不是通常做聊天机器人时所认知的 Bot。此处 Bot 是 HyperaiShell 中特别地用来接收并处理各类事件的功能聚合类,具有事件处理能力并通常实现某一部分特定功能。有关于 HyperaiShell 的 Bot 功能请参阅对应章节。

上次编辑于: 2020年7月18日 17:44