OrchardCore 如何动态加载模块?

【导读】今天,我们再次讨论下OrchardCore,通过初期调研,我们项目采用OrchardCore底层设施支持模块化,同时根据业务场景,额外还需支持二次开发,于是有了本文,若有不同解决方案,欢迎留言探讨

若对OrchardCore有所了解的童鞋应该知道,OrchardCore本身定位于CMS系统,同时整个架构并非前后分离,采用MVC模式开发,基于此,由于内置需要预编译视图以及考虑其他等等原因,不支持动态加载模块,本文给出我所想到的动态加载模块方案

OrchardCore基本使用示例

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

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

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

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

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

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

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

dotnet new ocmodulecms -n Test

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

OrchardCore.Module.Targets

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

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

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

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

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

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

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

查看底层模块设施源码,得知对外暴露其接口即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>();

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

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

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

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);}
});

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sed之G、H、g、h使用

前言 作者不善言谈&#xff0c;如有错误请指正&#xff01;&#xff01;&#xff01; 转载请注明出处&#xff01;&#xff01;&#xff01; sed之G、H、g、h使用 什么是sed&#xff1f; sed是面向流的行编辑器&#xff0c;所谓面向流&#xff0c;是指接受标准输入的输入&#…

人工智能路上,怎么能少了它!

目前&#xff0c;人工智能的应用日渐广泛。而作为人工智能核心的机器学习&#xff0c;是一门多领域的交叉学科&#xff0c;专门研究计算机模拟或实现人类学习行为的方法&#xff0c;以获取新的知识或技能&#xff0c;重新组织已有的知识结构使之不断改善自身的性能。简单来说&a…

墙裂推荐:这可能是CAP理论的最好解释

> 英文蓝本&#xff1a;http://ksat.me/a-plain-english-introduction-to-cap-theorem 经过小码甲意译、原创配图, 建议收藏。你可能经常听到CAP定理&#xff0c; 这个定理描述了在设计分布式系统时的天然约束。就像其他文章一样&#xff0c; 本文以现实场景对比理解CAP定理…

台湾 计算机术语,快取,陣列,程式,这些台湾的计算机术语,你知道几个?|冷知识...

原标题&#xff1a;快取&#xff0c;陣列&#xff0c;程式&#xff0c;这些台湾的计算机术语&#xff0c;你知道几个&#xff1f;|冷知识作者 | 楼下小黑哥来源 | 程序通事今天就不写技术文了&#xff0c;写点轻松的&#xff0c;带大家涨点知识。最近闲来无聊的时候&#xff0c…

计算机原理试题b,计算机组成原理试题B答案

计算机组成原理试题B答案 (3页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;9.9 积分计算机组成原理试题B答案一、 选择题1. D 2. A 3. A&#xff0c;C 4. B 5. B 6. B 7. B 8. B 9. A 10. D二、 填…

趣图:各种程序员的键盘热力图

图0&#xff1a;不保存不舒服斯基型图1&#xff1a;复制粘贴型 图2&#xff1a;复制粘贴型专用键盘图3&#xff1a;Vim 党新手&#xff08;内心OS&#xff1a;门在哪里&#xff0c;我要退出&#xff09;图4&#xff1a;Windows 程序员图5&#xff1a;01 党终极程序员 来源&am…

创建支持依赖注入、Serilog 日志和 AppSettings 的 .NET 5 控制台应用

翻译自 Mohamad Lawand 2021年3月24日的文章 《.NET 5 Console App with Dependency Injection, Serilog Logging, and AppSettings》 [1]在本文中&#xff0c;我们将构建一个 .NET 5 控制台应用程序&#xff0c;该应用程序支持依赖注入、日志记录和 appsettings 配置。你也可以…

作为一个前端,可以如何机智地弄坏一台电脑?

有人说&#xff0c;前端的界限就在浏览器那儿。无论你触发了多少bug&#xff0c;最多导致浏览器崩溃&#xff0c;对系统影响不到哪去。这就像二次元各种炫酷的毁灭世界&#xff0c;都不会导致三次元的世界末日。然而&#xff0c;作为一个前端&#xff0c;我发现是有方式打开次元…

IComparer实现文件名排序

↑↑↑ 点击左上角蓝字关注我&#xff0c;为您提供技术新动态。一、概要本文主要分享在文件对象处理中需要根据文件名排序思路。主要基于.net框架内提供的IComparer对象&#xff0c;它主要将定义类型为比较两个对象而实现的方法。二、详细内容1.场景在读取文件列表的时候&#…

WebService基于SoapHeader实现安全认证[webservice][.net][安全][soapheader]

WebService基于SoapHeader实现安全认证 本文仅提供通过设置SoapHeader来控制非法用户对WebService的调用&#xff0c;如果是WebService建议使用WSE3.0来保护Web服务&#xff0c;如果使用的是Viaual Studio 2008可以使用WCF&#xff0c;WCF里面提供了更多的服务认证方法。以下提…

Java 常见的 30 个误区与细节!

1 在Java中&#xff0c;没有goto语句。因为大量使用goto语句会降低程序的可读性和可维护性&#xff0c;所以Java语言取消了goto的使用。同时&#xff0c;为了避免程序员自行使用goto所带来的混乱&#xff0c;Java语言仍将goto定义为一个关键字&#xff0c;但是没有定义任何语…

信息技术上册教案了解计算机,信息技术上册全册教案

信息技术上册全册教案[课时]:1节课[教学内容]:认识媒体;认识多媒体[教学目标]:1、了解媒体的概念和分类&#xff0c;理解多媒体的内涵和特征。2、能从日常的生活和学习中感受各种媒体及其作用3、培养学生对媒体、多媒体的喜爱&#xff0c;引发他们继续学习的热情。[教学重、难点…

轻量级NuGet—BaGet

1. 介绍BaGet是一个轻量级的包管理服务。有些时候公司或者个人不希望某一些包进行公开&#xff0c;那么就需要使用私有的包管理服务程序&#xff0c;该服务是用.netcore进行编写的(感谢开发者为.NET社区做出的贡献)Github&#xff1a;https://github.com/loic-sharma/BaGet官网…

为什么这个SQL Server DBA学习PowerShell--SQL任务

我开始学习PowerShell&#xff0c;是因为我在寻找一种快速和高效的方式收集有关我的SQL Servers的信息和更好地管理我的服务器工作负载的方式。我以为&#xff0c;我正在学习是另一门新的脚本语言&#xff0c;它能帮我做到前面提到的设想。实际上&#xff0c;我发现学习 PowerS…

30张地图看懂世界格局,用大数据说话

摘要&#xff1a;世界那么大&#xff0c;要了解的数据那么复杂&#xff0c;下面知识探索小编帮您总结一下关于世界的数据。1、 世界人口聚居地红色越深人口密度越大&#xff1b;灰色代表无人地带。2、全球各国平均智商分布图颜色越浅智商越高3、全球冰川融化后的世界地图4、全世…

.NET Core3.1 Dotnetty实战教程

Dotnetty实战系列视频由于在.net的环境当中对dotnetty相关资料相对较少&#xff0c;所以这里主要分享一个dotnetty使用教程希望能帮助到正在使用这套框架的开发者们。虽然这套框架已微软官方已经不在维护&#xff0c;但是这套框架里的设计是相当不错的通过阅读源码能学习到很多…

计算机u打字,win7电脑打字打不出来怎么办

在windows电脑当中&#xff0c;必不可少的一个操作就是打字了&#xff0c;输入代码需要打字&#xff0c;网页中搜索也需要打字&#xff0c;网络聊天也需要打字&#xff0c;不过最近有位win7系统用户&#xff0c;在电脑中打开浏览器&#xff0c;输入想要找的资料的时候&#xff…

我用Python爬取了14年所有的福彩3D信息,彩民们,只能帮你们到这了

作者|丁彦军来源|恋习Python前两天&#xff0c;在网上看到一个有意思的问题&#xff1a;彩票预测靠谱么&#xff1f;为什么还有那么多的人相信彩票预测&#xff1f;暂且不说&#xff0c;彩票预测是否靠谱&#xff1f;彩票预测也分人而异&#xff0c;江湖上骗术很多&#xff0c;…

C#: 8.0 和 9.0 常用新特性

在《带你了解C#每个版本新特性》 一文中介绍了&#xff0c;C# 1.0 到 7.0 的不同特性&#xff0c;本文接着介绍在 8.0 和 9.0 中的一些常用新特性。C# 8.0在 dotNET Core 3.1 及以上版本中就可以使用 C# 8 的语法&#xff0c;下面是 C# 8 中我认为比较常用的一些新功能。默认接…

选股公式 成功率测试 软件,通达信股票软件选股公式,99%的成功率,你还等什么?...

工具&#xff1a;通达信金融终端使用方法&#xff1a;1、通达信软件界面2、点击“功能”“公式系统”“公式管理器”“条件选股公式”“其他类型”&#xff0c;点击新建3、使用选股公式&#xff0c;点击ctrlt&#xff0c;弹出条件选股窗口4、选中公式&#xff0c;点击加入条件&…