Skip to main content

28. 模块化开发

特别注意

以下的模块化配置必须在 appsettings.json 下配置才有效,原因是启动的时候 appsettings.json 已经加载,自定义配置文件还未加载。

28.1 关于模块化开发

模块化是代码的组成的一种方式,模块化系统就像乐高玩具一样,一块一块零散积木堆积起一个精彩的世界。每种积木的形状各不相同,功能各不相同,积木与积木直接互相依赖,互相支撑。

28.1.1 模块化开发好处

模块化开发能够将不同的功能组装在一起,实现功能的累加,诸多功能组装在一起,最终形成项目。

28.2 模块分类

  • 应用程序模块:通常这类模块是完整的应用程序,可以独立运行,有自己的实体、服务、API 及 UI 组件等。
  • 框架级模块:这类通常是解决某个业务功能进行开发的模块,比如上传文件、分布式缓存、数据验证等。

28.3 如何进行模块化开发

Furion 框架设计之初就考虑到模块化开发,所以从最初版本就具备此功能。启用 Furion 模块化支持非常简单。

28.3.1 启用模块化支持

{
"AppSettings": {
"EnabledReferenceAssemblyScan": true, // 启用模块化程序集扫描
"SupportPackageNamePrefixs": ["Module1", "Module2",...] // 配置通过 Nuget 方式安装的模块化包,如果不是通过 Nuget 方式可不配置
// "ExternalAssemblies": ["plugins/Module1.dll", "plugins/Module2.dll", ...] // 配置加载网站 plugins 目录下的模块程序集,可不配置
}
}

28.3.2 各种添加模块配置方式

添加模块到现有的应用中有多种方式:

  1. 直接通过项目添加模块化引用或编辑 .csproj 添加模块

这种方式无需任何配置,Furion 框架可自动加载模块。

  1. 通过添加 .dll 方式引用模块

需要配置 EnabledReferenceAssemblyScan 节点,如:

{
"AppSettings": {
"EnabledReferenceAssemblyScan": true
}
}
  1. 通过 Nuget 方式安装模块

如果通过 Nuget 方式安装模块,需要配置 SupportPackageNamePrefixs 节点,如:

{
"AppSettings": {
"SupportPackageNamePrefixs": ["Nuget包名称", "Nuget包名称",...]
}
}
  1. 通过动态加载 .dll 方式安装模块

这种方式通常是在网站创建一个文件夹放入模块化 .dll 文件,如:plugins,无需添加引用可自动加载。

{
"AppSettings": {
"ExternalAssemblies": ["plugins/Module1.dll", "plugins/Module2.dll", ...]
}
}
特别注意

如果非生产环境,那么 plugins 文件夹放在 bin\Debug\net5.0\bin\Release\net5.0 目录下。

如果是生产环境,则直接放在根目录即可。

28.4 模块化开发注意事项

  • 尽可能保证每个模块都有独立的路由地址格式:/模块化名称/路由地址,这样才能保证不会和现有的系统出现冲突。
  • 开发模块化是尽可能设计为完全独立的引用,如果需要包含 UI 元素如视图、html/cs/javascript 应采用嵌入式方式
  • 模块化开发如果需要添加第三方服务,应配置在 AppStartup 的派生类中。
  • 模块化的所在程序集的注释文件 .xml 需放在和 .dll 同级目录

28.5 关于热插拔机制

Furion v2.4.0 + 版本之后,框架移除了热加载和热卸载模块的功能,原因是目前微软提供的 AssemblyLoadContext + 文件夹监听 处理 .dll 运行时热拔插机制还未成熟,此功能将在 .NET6 版本得到改善。

也就是,自 v2.4.0+ 版本之后,Furion 框架只提供在启动时加载模块,不在运行时进行任何处理。

28.6 反馈与建议

与我们交流

给 Furion 提 Issue