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 各种添加模块配置方式
添加模块到现有的应用中有多种方式:
- 直接通过项目添加模块化引用或编辑
.csproj
添加模块
这种方式无需任何配置,Furion
框架可自动加载模块。
- 通过添加
.dll
方式引用模块
需要配置 EnabledReferenceAssemblyScan
节点,如:
{
"AppSettings": {
"EnabledReferenceAssemblyScan": true
}
}
- 通过
Nuget
方式安装模块
如果通过 Nuget
方式安装模块,需要配置 SupportPackageNamePrefixs
节点,如:
{
"AppSettings": {
"SupportPackageNamePrefixs": ["Nuget包名称", "Nuget包名称",...]
}
}
- 通过动态加载
.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。