【导读】ABP vNext并未过多探究,当然其基于DDD理念分层清晰,灵活性、扩展性自然也不在话下,但有些情况下我可能会首选OrchardCore,并非ABP vNext不可

若改造项目,也因历史遗留问题,数据库表设计也可能存在不合理,此时从头开始再搭建如此庞大的架子,感觉会有点虚空,同时也要考虑团队内部情况,不是那么容易上手,反而可能会违背初心,花更多时间和精力在各种模型理解上

我们完全可以为后续做铺垫,先搭建出底层基本设施,再基于此做灵活扩展即可,每个公司项目具体情况都不一样,比如仓储模式可能需要结合项目进行对应 改造,仓储只是提供了一种基本思想,若真将网上普遍流传的模式照搬可能并不是那么好用,可能会认为仓储莫不是一种反模式

.NET Core模块化插件

.NET Core内置提供了AssemblyLoadContext加载dll插件方式实现模块化,然后将其进行注册

            var mvcBuilder = services.AddMvc();foreach (var module in modules){// Register controller from modulesmvcBuilder.AddApplicationPart(module.Assembly);}

这种方式虽可行,在我看来只能作为一种临时解决方案并不利于长期,因为需额外创建一个新的项目,然后加载所生成dll,由于没有底层设施做支撑,所以极易引起版本不一致问题,而且手动被迫性质太强,实现模块化方案最终的目标则只需关注业务逻辑实现,我们来看看OrchardCore如何实现模块化。

OrchardCore模块化思想

这里我们并不讨论和ABP vNext二者谁更强大,没有任何意义,比如需结合现有项目情况、项目大小、是否为多租户、实施难度等等多方面考虑才能得出基本结论,而不是一味追求当前主流

比如我们只是想实现模块化方案,建议选择OrchardCore来实施,因为很简单,我们可将其剥离为我所用,而后结合项目情况是否考虑利用ABP vNext来进行分层处理。借鉴核心思想、才能保证一切可在控制范围内

首先我们先从整体上对OrchardCore做个认识,细枝末节暂不考虑:基于ASP.NET Core多租户模块化应用框架。

版本管理:无论是底层设施、基本框架、模块都通过包管理,同时框架和包版本基本(包管理走框架包版本)可以统一管理(对于版本升级很重要)

核心思想:模块实现模块特性,通过MSBuild构建主程序所添加实现模块特性的模块包,底层设施扫描模块特性将其注册到容器中,当然模块和模块特性都可进行基本信息描述

OrchardCore模块化原理

整个项目架构如下图所示

OrchardCore:底层设施以及可能需要添加的组件(比如本地化、日志、文件存储、缓存、Lucene等)

OrchardCore.Frameworks:MVC框架

OrchardCore.Modules:模块化包(比如邮件服务、后台作业服务、第三方集成等等)

OrchardCore.Modules.Cms:Cms模块包

OrchardCore.Themes:主题管理

OrchardCore.Cms.Web:主程序

我以内置所提供示例程序给大家讲解整个详细流程,而后有需要更细致了解的童鞋就可以很快上手了,如下示例主程序加载示例模块,主程序直接采用引用该示例模块(实际则是通过nuget下载该模块)

正常情况下我们通过nuget直接下载的是程序包,而OrchardCore对于入口则是利用MSBuild加载targets文件(其他组件则直接下载对应包),而targets引用对应包,通过这种中转方式根据我的理解主要解决了两个问题,其一则是可以屏蔽底层设施包(一次性下载),最重要的是通过targets文件可自动添加主程序程序集所加载模块包特性

是不是感觉有点懵,那到底是如何加载模块包特性的呢?来,请看如下图,我们以实际操作从头再来做一个完整梳理(注意:为排版美观,如下都将省略OrchardCore前缀)

【1】创建Mvc.Web程序,在nuget上下载Application.Mvc.Targets包

【2】创建Mvc.HelloWorld模块,在nuget上下载引用Module.Targets包

【3】Mvc.Web主程序引用我们所使用的Mvc.HelloWorld模块

【4】Application.Mvc.Targets包引用Application.Targets(引入底层设施)和MVC.Core(引入MVC框架)

【5】示例模块引入模块包,该包中存在模块特性(Module类)

【6】Application.Targets包下存在Application.Targets.targets文件,由于主程序引用了该包,添加所引用实现模块特性的包程序集信息到主程序集

学习OrchardCore的前提一定要基本了解和会使用MSBuild,这里不详细展开,此时我们生成解决方案,我们将会看到主程序集里面将会自动生成所实现模块特性的模块程序集信息

到这里我们已经研究完主程序如何识别模块包,接下来则是如何加载模块包以及对应注册服务信息

OrcharCore核心在于OrchardCore和OrchardCore.Abstractions这两个底层设施包

归根到底,其底层设施源码一部分可能从官方源码拷贝过来(自我猜测),为实现多租户模式,势必要构建租户的容器和路由中间件,这中间就涉及在容器中需要维护每一个租户上下文(ShellContext),并且也要跟踪每个租户的状态。

ModularTenantContainerMiddleware作为创建租户容器中间件

ModularTenantRouterMiddleware作为租户路由中间件

网上资料一大把,此处省略若干字,有任何疑问可评论区留言,尽力解答

OrchardCore模块化实践

我将核心进行了剥离,实现了模块化的一个demo,将多租户这一块我也进行了去除,只保留了Shell相关基本概念,实际情况下,这些都可以去除,基于当前请求构建Scope,而无需再额外构建ShellScope和上下文等等,考虑好释放等问题就好

示例主程序为ModularDemo.Web.Test,模块为ModularCore.Test,启动主程序访问模块中接口

OrchardCore实现模块化核心原理分析相关推荐

  1. RPC 实战与核心原理分析

    RPC 实战与核心原理分析 RPCX是一个分布式的Go语言的 RPC 框架,支持Zookepper.etcd.consul多种服务发现方式,多种服务路由方式, 例子 服务端 package maini ...

  2. Shiro(三) Shiro核心原理分析

    一.Shiro登陆认证原理 对于登陆请求(URL=/login.html),我们一般使用"anno"拦截器去过滤处理,而这个filter又是放行所有资源的(不作任何处理),所以登陆 ...

  3. Spring IOC核心原理分析

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,本文系统分 ...

  4. 玩转Koa之核心原理分析

    Koa作为下一代Web开发框架,不仅让我们体验到了async/await语法带来同步方式书写异步代码的酸爽,而且本身简洁的特点,更加利于开发者结合业务本身进行扩展. 本文从以下几个方面解读Koa源码: ...

  5. Spring AOP核心原理分析

    "横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面.所谓"切面" ...

  6. Apache Iceberg核心原理分析文件存储及数据写入流程

    点击上方蓝色字体,选择"设为星标" 回复"面试"获取更多惊喜 全网最全大数据面试提升手册! 第一部分:Iceberg文件存储格式 Apache Iceberg作 ...

  7. SpringBoot 核心原理分析

    spring-boot-loader maven将SpringBoot启动类打到fatJar JarLauncher SpringApplication SpringBoot项目的入口 启动类: @S ...

  8. 并发编程系列——3ThreadLocal核心原理分析

    学习目标 ThreadLocal是啥 ThreadLocal是干啥用的 ThreadLocal底层数据结构是什么 ThreadLocal如何解决hash冲突的 java中存在哪几种引用 ThreadL ...

  9. airflow mysql_Airflow 使用及原理分析

    Airflow 入门及使用 什么是 Airflow?Airflow 是一个使用 Python 语言编写的 Data Pipeline 调度和监控工作流的平台. Airflow 是通过 DAG(Dire ...

最新文章

  1. 【Vegas原创】“無法解析 equal to 動作的定序衝突”错误的处理
  2. 您为了什么而学?【一入红尘深似海 勿负天下有心人】
  3. HDU多校4 - 6989 Didn‘t I Say to Make My Abilities Average in the Next Life?!(单调栈)
  4. 3月31日学习笔记(CSS基础)
  5. css 文字超出隐藏显示省略号
  6. 基于centos7进行yum安装lnmp linux+nginx+php7.1+mysql5.7
  7. ubuntu16.04根目录扩容
  8. 计算机用户程序举例,劳顿管理信息系统习题集-第8章信息系统安全
  9. 腾讯云服务器安装AMH控制面板
  10. dnf修改服务器时间限制,DNF历史性革新,团本刷新时间改为周六,为黑鸦让路
  11. Java中的final变量、final方法和final类
  12. SPSS结果解读——【独立样本T检验】【方差齐性】
  13. pet 计算机术语,计算机专业英语翻译1?计算机专业英语翻译1、Tobecompet 爱问知识人...
  14. 纳米结构的仿真和分析
  15. 微信小程序学习3(wxss)
  16. 非常好的免费开源网站原型图设计工具
  17. 部门新来了个阿里25K出来的,让我见识到了什么是天花板
  18. 高等工程数学 —— 第一章 (2)矩阵的谱半径与条件数
  19. 一问三不知之log4j2漏洞简析
  20. 【C++】0314算法阿里笔试题

热门文章

  1. Flask 【第七篇】Flask中的wtforms使用
  2. Event 事件 - 基础
  3. C#学习笔记-Windows窗体自定义初始位置
  4. ------shell学习
  5. wamp5.5.12安装re dis扩展
  6. PHP中的include、include_once、require、require_once
  7. 设计模式21:State 状态模式(行为型模式)
  8. Scala:First Steps in Scala
  9. 因特网使用期限_Internet死亡时使用PC的其他方式
  10. E-MapReduce上如何升级EMR-Core