扩展(Extensions)

支持动态加载扩展,可通过扩展添加/定制现有应用功能,实现模块化开发。

扩展部署与加载

扩展部署在应用运行目录之外的某个目录例如 Extensions 下,具体由配置文件里的 "RCL:ExtensionsDirectory" 配置项决定,对应属性为 ExtensionsDirectoryopen in new window
各个扩展放置在该目录下的各个子目录里,即扩展部署目录结构为:

├─Extensions
  └─MyExt1
    └─QuickAdmin.Extensions.MyExt1.dll
    └─RefLib1.dll
    └─RefLib2.dll
    └─cfgs
      └─aaa.json
      └─bbb.json
    └─...
  └─MyExt2
    └─QuickAdmin.Extensions.MyExt2.dll
    └─...
  └─MyExt3
    └─QuickAdmin.Extensions.MyExt3.dll
    └─...

为避免无效检测,扩展的主程序集文件名约定格式为:"QuickAdmin.Extensions.xxx.dll" ("xxx" 不需要一定和子目录名一样)。
应用程序启动时,将找出 Extensions 下的各个子目录,并在子目录下查找 "QuickAdmin.Extensions.xxx.dll" 程序集文件, 然后在该程序集内查找实现了接口 IExtensionopen in new window 的公共实现类, 若找到便将其作为扩展加载进来。加载时会创建一个该实现类的新实例并将该实例以单例模式注入到系统服务中。

扩展的加载次序为各个子目录名称的升序排列顺序。
若要只加载部分子目录里的扩展,可通过 "RCL:ExtensionDirsToIncludeOrExclude" 配置项去设置,对应属性为 ExtensionDirsToIncludeOrExcludeopen in new window

扩展管理页面

系统内置的扩展管理页面为:~/QAdmin/Setup/Extensions。Demo 里扩展管理菜单项位于 系统管理->系统配置 菜单下。
可在该页面里查看已加载扩展信息,并进行停用、启用等操作。
ExtensionsMng1
点击行首的加号或双击行将展开显示对应扩展上下文里当前已加载的其它程序集信息,例如某扩展引用了其它 NuGet 包或其它程序集:
ExtensionsMng2

扩展开发

QuickAdmin.Net 提供了快速开发扩展的项目模板:
ExtensionsDev1
用 "QuickAdmin.Net Extension Solution" 模板创建解决方案,其中包含了扩展示例代码,以及可直接调试扩展的 WebApp,参见创建后打开的文件里的说明。
该模板示例演示了扩展内如何注册服务、提供 API、提供 Razor 页面、嵌入并使用静态资源、实现停用启用功能等等。

如果扩展引用了其它程序集或 NuGet 包,开发完成后部署时,需要确保把相关文件都要拷贝到部署目录。其中若有与 QuickAdmin.Net 或者宿主 WebApp 引用了相同的程序集或包,则这些相关文件不需要拷贝到部署目录。

另外若扩展引用了 NuGet 包,且这些包是 QuickAdmin.Net 以及宿主 WebApp 没有引用的,则需要在扩展项目文件里加入以下配置以确保能够正常调试扩展:

<PropertyGroup>
  <EnableDynamicLoading>true</EnableDynamicLoading>
</PropertyGroup>

加上该配置后,在生成时才会把 NuGet 包的文件复制到输出目录。若不加,输出目录里将不含 NuGet 包文件,调式时会提示找不到所需程序集。