广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >OrchardCore 如何动态加载模块
  • 709
分享到

OrchardCore 如何动态加载模块

2024-04-02 19:04:59 709人浏览 安东尼
摘要

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

这篇文章主要讲解了“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 如何动态加载模块这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: OrchardCore 如何动态加载模块

本文链接: https://www.lsjlt.com/news/71705.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • OrchardCore 如何动态加载模块
    这篇文章主要讲解了“OrchardCore 如何动态加载模块”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“OrchardCore 如何动态加载模块”吧!Or...
    99+
    2022-10-19
  • python动态加载模块、类、函数
    动态加载模块: 方式1:系统函数__import__() 方式2:imp, importlib 模块 方式3:exec 函数 动态加载类和函数 首先,使用加载模块,使用内置函数提供的反射方法getattr(),依次按照层级...
    99+
    2023-01-31
    函数 模块 加载
  • Pythonpkg_resources模块动态加载插件实例分析
    使用标准库importlib的import_module()函数、django的import_string(),它们都可以动态加载指定的 Python 模块。 举两个动态加载例子: ...
    99+
    2022-11-11
  • python中动态加载模块和类方法实现
    python中动态加载模块和类方法实现测试代码   文件名: mytest.py 具体代码如下:   注意:模块名,类名,方法名都是变量。   #coding=UTF-8 class TestClass: def sub(se...
    99+
    2023-01-31
    模块 加载 方法
  • Vue如何实现异步动态加载块
    本篇内容介绍了“Vue如何实现异步动态加载块”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先定义组件为异步加载define(['j...
    99+
    2023-07-04
  • pycharm如何加载模块
    要在PyCharm中加载模块,可以按照以下步骤操作:1. 打开PyCharm,并打开您的Python项目。2. 在项目文件夹中创建一...
    99+
    2023-08-15
    pycharm
  • Python如何实现模块和加载模块
    这篇文章主要介绍Python如何实现模块和加载模块,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!python可以做什么Python是一种编程语言,内置了许多有效的工具,Python几乎无所不能,该语言通俗易懂、容易入...
    99+
    2023-06-08
  • ubuntu如何禁止模块加载
    ubuntu禁止模块加载的示例:例如禁止PHP模块,通过终端命令行实现。使用phpdismod命令从系统中禁用任何不必要的php模块。$ phpdismod mbstring //对所有PHP版本和所有SAPI禁用mbstring模块。禁用...
    99+
    2022-10-21
  • Webpack 模块加载动态引入机制源码示例解析
    目录TL;DR准备阶段Runtime模块被打包成了什么样子?静态引入动态引入模块联邦引入原理TL;DR 本文基于 Webpack 5 进行讲解,适合不了解 Webpack 把资源编译...
    99+
    2022-11-13
  • AngularJS如何使用angular.bootstrap完成模块手动加载
    这篇文章主要介绍AngularJS如何使用angular.bootstrap完成模块手动加载,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!本文实例分析了AngularJS使用angu...
    99+
    2022-10-19
  • AngularJS怎么通过ocLazyLoad实现动态懒加载模块和依赖
    这篇文章将为大家详细讲解有关AngularJS怎么通过ocLazyLoad实现动态懒加载模块和依赖,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。实现的过程主要是引用3个主...
    99+
    2022-10-19
  • Angular中怎么懒加载模块并动态显示它的组件
    本文小编为大家详细介绍“Angular中怎么懒加载模块并动态显示它的组件”,内容详细,步骤清晰,细节处理妥当,希望这篇“Angular中怎么懒加载模块并动态显示它的组件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-07-04
  • 权限管理模块中动态加载Vue组件怎么实现
    本篇内容介绍了“权限管理模块中动态加载Vue组件怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!登录状态保存当用户登录成功之后,需要将...
    99+
    2023-06-19
  • Angular懒加载动态创建显示该模块下声明的组件
    目录环境: Angular 13.x.x新建一个angular项目懒加载工具栏组件toolbar.module.tstoolbar.component.tstoolbar.compo...
    99+
    2022-11-13
  • VueJs中怎么实现异步动态加载块
    本篇文章给大家分享的是有关VueJs中怎么实现异步动态加载块,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先定义组件为异步加载define(...
    99+
    2022-10-19
  • iscroll如何动态加载数据
    这篇文章将为大家详细讲解有关iscroll如何动态加载数据,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下<div id="wrapp...
    99+
    2022-10-19
  • 如何动态加载JavaScript文件
    这篇文章主要介绍如何动态加载JavaScript文件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、使用document.write/writeln()方式该种方式可以实现js文件...
    99+
    2022-10-19
  • 如何动态加载PHP扩展
    这篇文章给大家介绍如何动态加载PHP扩展,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。查看是否已经加载了扩展echo extension_loaded("redis");非常简单的一个函数...
    99+
    2023-06-20
  • javascript如何动态导入ECMAScript模块
    小编给大家分享一下javascript如何动态导入ECMAScript模块,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! ECMAScript(又名ES2015...
    99+
    2022-10-19
  • Vue如何动态添加模板
    今天小编给大家分享一下Vue如何动态添加模板的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。例如要做一个类 select 的组...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作