淺談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知其然,知其因此然。

相關文章
相關標籤/搜索