文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

OrchardCore 如何动态加载模块

2024-04-02 19:55

关注

这篇文章主要讲解了“OrchardCore 如何动态加载模块”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“OrchardCore 如何动态加载模块”吧!

OrchardCore基本使用示例

OrchardCore采用包管理各个模块,所以有自建NuGet,我们提前配置好OrchardCore程序包源

OrchardCore 如何动态加载模块

项目采用前后分离,所以我们创建WebAPi应用程序,为支持模块化开发,如上图下载模块开发应用程序包

紧着在Startup文件中,添加OrchardCore服务以及使用其中间件,如下图

OrchardCore 如何动态加载模块

至此一个基本的模块化项目就创建完毕,接下来我们创建模块,官方提供模块包模板引擎

OrchardCore 如何动态加载模块

通过对应命令将模板引擎下载至本地

dotnet new -i OrchardCore.ProjectTemplates::1.0.0-rc2-16113 --nuget-source https://nuget.cloudsmith.io/orchardcore/preview/v3/index.json

OrchardCore 如何动态加载模块

然后我们在项目解决方案下,继续通过CLI将下载至本地模板引擎来创建模块项目,并引入到项目解决方案中

dotnet new ocmodulecms -n Test

OrchardCore 如何动态加载模块

由于我们用不到视图,所以将视图文件夹以及对应默认安装包删除,只需保留如下模块包就好

OrchardCore.Module.Targets

同时也一并将项目文件中支持MVC配置给删除,否则会生成视图程序集,猜测应该会引起模块加载依赖需额外加载视图dll

OrchardCore 如何动态加载模块

我们将模块默认创建控制器修改为访问接口形式,方便接下来测试验证

OrchardCore 如何动态加载模块

那么接下来我们应该如何将开发好的模块进行加载呢?

OrchardCore动态加载模块(前后分离)

了解OrchardCore基本原理的我们应该知道,默认情况下,主项目添加模块引用时,会通过MSBuild在对应模块程序集中,添加模块标识,如下:

OrchardCore 如何动态加载模块

如上图所示,一个是模块标识,一个是对应文件路径标识

当启动主项目时,会找到对应程序集模块标识,并注册服务以及其他操作,如此看来,我们只需深入了解源码中是否存在存储对应模块信息的接口呢?

查看底层模块设施源码,得知对外暴露其接口即IModuleNamesProvider

好家伙,我们将生成模块dll放在主项目程序启动modules目录下,接下来我们实现该接口,如下:

public class DynamicModuleNamesProvider : IModuleNamesProvider {     private readonly List<string> _moduleNames = new List<string>();      public DynamicModuleNamesProvider()     {         var baseDirectory = AppContext.BaseDirectory;          var location = Path.Combine(baseDirectory, "modules");          if (!Directory.Exists(location))         {             return;         }          foreach (var file in Directory.EnumerateFiles(location))         {             var assemblyPath = Path.Combine(location, file);              var assembly = Assembly.LoadFrom(assemblyPath);              _moduleNames.AddRange(assembly.GetCustomAttributes<ModuleMarkerAttribute>().Select(m => m.Name));         }     }      public IEnumerable<string> GetModuleNames()     {         return _moduleNames;     } }

将其以单例形式注入,如下

services.AddSingleton<IModuleNamesProvider, DynamicModuleNamesProvider>();

我们启动主项目验证确认,模块已然进行加载,如下:

OrchardCore 如何动态加载模块

但是访问控制器接口却显示404

OrchardCore 如何动态加载模块

并未继续深入查看源码,至少可知,通过动态加载内置仅仅只注册了相关服务,猜测是和移除对应视图包有关导致并未激活控制器、视图等等

OrchardCore动态加载模块激活控制器

由于控制器、视图、TagHelper等等相关FeatureProvider并未激活,所以我们借助AssemblyPart来实现,将其作为应用程序的一部分,通过扫描模块,将对应控制器等激活,如下:

var builders = services.AddControllers();  builders.ConfigureApplicationPartManager(apm => {     var baseDirectory = AppContext.BaseDirectory;      var location = Path.Combine(baseDirectory, "modules");      if (!Directory.Exists(location))     {         return;     }      foreach (var file in Directory.EnumerateFiles(location))     {         var assemblyPath = Path.Combine(location, file);          var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(assemblyPath);          var assemblyPart = new AssemblyPart(assembly);          apm.ApplicationParts.Add(assemblyPart);     } });

OrchardCore 如何动态加载模块

虽然官方并未提供动态加载模块示例,但我们依然可以借用其对外暴露接口来实现,理论上若是采用MVC模式,应该也可以进行动态加载

感谢各位的阅读,以上就是“OrchardCore 如何动态加载模块”的内容了,经过本文的学习后,相信大家对OrchardCore 如何动态加载模块这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯