浅谈Abp vNext的模块化设计

abp的模块化给我留下深入的印象,模块化不是什么新概念,你们都习觉得常,可是为何要模块化,模块化的意义或者说目的是什么?也许咱们思考得并不深刻。可贵的是abp不只完美的阐述了模块化概念,并且把模块化落地得十分优雅,而且进行了开源。node

模块化内涵?

模块分类

  根据粒度大小的不一样,模块具备各自的概念,咱们从小到大来看一下模块都有哪些内容。数据库

  • 零件——class(最小)
  • 组件——component(较小),软件的最小部署单元,好比jar,dll等
  • 模块——module(更大),具备独立命名空间,可独立开发、部署和测试,具有和其余模块组装的能力,好比用户管理模块、租户模块等,在Abp vNext当初,一个模块就是一个项目。
  • 微服务——microservice(最大),好比工单服务,巡检服务,保养服务等

  

Abp的模块是什么

  不少人对Abp vNext模块化的理解可能都不同,我理解的模块化至少应该包括如下一些内容:编程

  • 广义上包括:实体、服务、APIs、UI页面、数据库
  • 应用上包括:帐号管理、身份管理、租户管理、设置管理、权限管理…
  • 部署上包括:柔性部署(包括独立部署,也可集成部署)
  • 能力上包括:服务任意拼装、组合
  • 技术上依托:反射、配置、工厂、注入、动态代理等底层技术
  • 模块划分姿式:类微服务,纵向,横向,部署便捷,维护成本

  从Abp vNext的开源代码和demo里,咱们随处能够看到module这个单词,并且一旦咱们的project继承abpModule后,依赖abp底层的注入能力,咱们即刻给项目赋予了模块化能力,同时,借助自动controller和动态代理的能力,模块之间通讯只须要简单配置便可。能够说没有以上两种能力,模块化的落地也就无从谈起了。json

模块化有什么意义?

  若是直接问你模块化的意义,可能你一会儿还组织很差语言,由于没法用一句话来讲明白。可是若是你想到乐高的存在,你必定会有所感悟。统一了模块化内涵,模块化的目的就十分明晰了。咱们但愿能像积木同样复用咱们的基础能力,不论是架构能力仍是应用能力,咱们不想重复造轮子。缓存

我的以为Abp vNext的模块化背后有着丰富的内涵。通读abp的官方文档,对模块化的理解更加全面些,我的理解,abp的模块化至少包含如下几层含义:安全

       

  • 原子封装,高度内聚——从设计原则看职责相对单一独立
  • 功能独立,职责单一——从设计原则看摆脱了耦合的风险
  • 随意组合,按需装配——从扩展来看十分灵活,容易维护
  • 独立开发,独立部署——从任务分解来看,分工很是容易
  • 面向接口,遵循约定——从框架设计来看,功底深厚
  • 极少修改,能力复用——从业务角度看,极大提升开发效率

  以上每一层都是层层递进,而最终的目的是为了达到企业级的能力复用,这和“高大上”的中台的意义不谋而合,不一样的是粒度大小不一样罢了。闭包

  为了说的明白些,这里举一个例子:架构

  

   咱们能够看到租户和用户模块能够和业务模块任意拼装,最后完成一个新的系统。app

  • 若是你作的是2B的物业系统,你无需或者极少修改代码,就能够和组织管理进行组合成一个新的系统;
  • 若是你作的是2C的公众号,你又能够极速高效地和订餐系统组装成了另一个系统。

   至此,你应该理解了模块化的价值和意义了?框架

模块化和DLL区别

  通常使用DLL的时候咱们会先添加引用,而后直接调用,有时候还要增长默认配置。从这个角度看ABP的模块化应用是同样的,也须要增长Volo.Abp.*打头的DLL,同时依赖一些appsetting的配置。

  不一样于DLL的地方在于继承AbpModule模块的类:

  这个类的用途是作服务注册、配置或先后注册和配置的一些初始化工做。这是一个重大的不一样,由于基于此,咱们全部在ABP模块化的基础上均可以互相拼装,不论是基础框架仍是应用框架。拼装后的项目具有了一种新的能力或者能够单独分布式部署,这是DLL作不到。

  举个例子,加入咱们想在BookStore项目上集成Account/PermissionManage/TenantManage/Identity等服务,咱们会怎么作?有两种方式,一种是单体,直接进行DependOn就集成了,中间是低代码的组装,而DLL的传统作法是作不到的,由于它只是一个类库,须要引用后集成编码,代码量是嵌入或者说是织入而成,是主代码的一个零部件,很是难以解耦。另一种是分布式微服务部署,咱们能够把Account/Permission/Identity进行独立部署,其余项目想要进行集成也没有问题,采用微服务方式进行交互或者单点登陆。全部ABP vNext的模块化是微服务兼容的,从这个级别上看二则不可同日而语。

模块化拆分原则

高内聚

  • 复用/发布等同原则(复用的最小粒度等同于发布的最小粒度)

  这点在ABP vNext上能够很明显得看到,全部继承AbpModule的模块都是能够独立部署的,不论是一个Project或者Class都是支持的。

  • 共同闭包原则(一个组件不应存在多个变动缘由:会同时修改的类放在一个组件中)

  咱们在作微服务演化和领域拆分的时候,这个原则是很是受用的。好比咱们能够先把Tenant.Application和Account.Application按照接口和模块化进行提早拆分,经过ApiHost汇总单块部署,当咱们须要进行拆分的时候,咱们只须要对ApiHost进行一分为二便可,这个拆分是低代码的。以下图所示:

    • Application层:

 

这个层的代码能够提早进行领域划分,但倒是按照模块集成部署,微服务化后代码零变动。

    •  API Host层:

 

服务拆分后这三个块的代码几乎是如出一辙的。(具体可参看个人视频《ABP vNext框架实战系列》)

  • 共同复用原则(不强迫用户依赖他们不须要的东西)


  如上所示,虽然Microsoft扩展配置模块是一体的,可是咱们只要依赖Configuration.Abastraction便可。若是说共同闭包原则是作模块化内的加法,共同复用原则是作模块内容的减法,即把无须要依赖的内容剥离出去,让依赖更加纯净。

低耦合

  • 依赖于接口而非实现

  

 

   如上图所示,咱们的租户依赖的除了租户接口之外,咱们依赖的帐户服务也是面向接口编程,这大大减小了服务之间的耦合,减小了拆分带来的巨大变动和代价。

  • 职责单一原则

  这个原则高度抽象和适用,ABP vNext也是到处体现这种思想,咱们看下图官方模块源码的截图也能看到这个原则的落地运用。

  • 依赖反转原则

  依赖反转是一种设计思想,但愿帮流程从运用中剥离出来,并把可复用的流程转移到框架之中,让框架具有能力复用的能力,从而依赖框架生产出无穷产品的能力。

 

官方模块源码

  从大的方面看,能够把abp的模块分为:

  • 应用模块,好比:博客、 文档、身份管理等等,以下图所示,惋惜目前只有doc和blog属于免费的。

  

  • 框架模块,好比:缓存、邮件、主题、安全性、序列化、验证受权等等,以下图所示,每一个模块的用途基本上是有迹可循的。

  

总结

  ABP vNext的模块化思想真的让人印象深入,还有不少须要你我共同挖掘和学习的地方,我在这儿只是抛砖引玉,但愿有更多的人能参与进来进行分享。若是你想了解更多ABP vNext的地方,你也能够参看个人视频《ABP vNext框架实战系列》,谢谢您的捧场。

  AbpvNext是一款优秀的框架,可是要从零开始能把每一个角落都熟悉起来须要很多摸索时间,但愿经过本身的经验给你的快速学习赋能,抛开生成器,一块儿从零开始,手工打磨一款生产级别的框架,让你对AbpvNext知其然,知其因此然。

相关文章
相关标签/搜索