Abp太重了?轻量化Abp框架
本文首發(fā)于個人博客(https://blog.zhangchi.fun/)
在進行框架的選型時,經(jīng)常會聽到“***框架太重了”之類的聲音,比如“Abp太重了,不適合我們...”。事實上,Abp框架真的很重嗎?
框架的“輕”和“重”,我沒有在網(wǎng)上找到明確的定義,通過閱讀一些技術(shù)博客,大致可以把框架的“輕”和“重”通過以下幾個方面進行區(qū)分:
所依賴程序集的數(shù)量
所實現(xiàn)的功能的多少
上手難度及易用性
“輕量級”的框架,大概指的是一個程序集依賴少且程序集文件小、功能雖少但足夠滿足需求、上手容易使用簡單的框架;“重量級”的框架,大概指的是一個程序集依賴多且程序集文件大、功能豐富但大多數(shù)用不到、上手困難且使用困難的框架。
這篇文章將從上述幾個方面來探索Abp是一個“輕量級”還是“重量級”的框架。
最小依賴
Abp開發(fā)了一些啟動模板來為我們生成項目。啟動模板采用了領(lǐng)域驅(qū)動設計的分層方案來建立項目層級,包括了展示層、應用層、領(lǐng)域?qū)?/strong>與基礎設施層。
我們通常都會通過Abp CLI或Abp.io來創(chuàng)建類似上圖架構(gòu)的項目。Abp為我們生成的項目,減少了我們初始化項目的工作量,開箱即用,因此將我們可能會使用的Nuget包預先引入到我們的項目中,也就給我們一種依賴項太多的感覺。
從架構(gòu)設計上來講,模塊化是Abp的核心;而從技術(shù)角度來看,依賴注入則是Abp實現(xiàn)眾多功能的一個主要手段。只要了解Abp的模塊化和依賴注入,我們就能夠基于Abp框架來進行項目開發(fā)。
接下來將創(chuàng)建一個原生的ASP.NET Core Web API項目,圍繞模塊化和依賴注入兩個核心概念,來展示如何以最小依賴的方式使用Abp。
通過VS或者dotNet cli新建一個原生的ASP.NET Core Web API項目,命名為LightweightAbp;
安裝Nuget包Volo.Abp.Autofac和Volo.Abp.AspNetCore.Mvc;
將項目進行模塊化:在項目根目錄新建一個Abp模塊代碼文件LightweightAbpModule.cs,并復制以下代碼:
將Startup中的代碼調(diào)整到LightweightAbpModule中,代碼如下:
更改Startup中的代碼以使用Abp的模塊化系統(tǒng):
更改Program的CreateHostBuilder方法以使用Abp的依賴注入系統(tǒng)(基于Autofac):
將項目生成的WeatherForecastController基類ControllerBase更改為AbpController。
按F5運行。
至此項目的創(chuàng)建完成了。可以看到,僅僅依賴了Volo.Abp.Autofac和Volo.Abp.AspNetCore.Mvc兩個Nuget包,即可利用Abp進行開發(fā)。若從所依賴Nuget包數(shù)量來評估框架的“輕”和“重”,那么Abp不可謂不輕。
功能按需使用
得益于模塊化設計,Abp將其所能提供的功能,劃分并封裝到了不同的模塊中。要想使用Abp提供的某一功能,只需引入相關(guān)的Nuget包并依賴(DependsOn)模塊即可。
數(shù)據(jù)訪問
要想實現(xiàn)數(shù)據(jù)訪問功能,首先我們需要定義Entity、DbContext并配置數(shù)據(jù)庫支持。在Abp的層次架構(gòu)中,Entity、Repository屬于領(lǐng)域?qū)?#xff0c;Service屬于應用層,DbContext則屬于EntityFramework Core模塊,因此我們按需引入所需模塊即可。
安裝Nuget包Volo.Abp.Ddd.Application、Volo.Abp.Ddd.Domain和Volo.Abp.EntityFrameworkCore.Sqlite;
在LightweightAbpModule類中配置DependsOn特性,將AbpDddApplicationModule、AbpDddDomainModule和AbpEntityFrameworkCoreSqliteModule模塊依賴到我們的項目模塊中。
然后創(chuàng)建實體Book及數(shù)據(jù)庫上下文LightweightAbpDbContext:
在LightweightAbpModule的ConfigureServices方法中配置數(shù)據(jù)庫訪問:
在appsettings.json中配置數(shù)據(jù)庫連接字符串
安裝Nuget包"Microsoft.EntityFrameworkCore.Tools",并在在項目根目錄下打開命令行工具,依次執(zhí)行以下命令進行數(shù)據(jù)遷移和數(shù)據(jù)庫更新:
創(chuàng)建IBookAppService及BookAppService:
在文件夾Controllers中創(chuàng)建BookController:
F5以調(diào)試模式運行即可在Swagger頁面上插入數(shù)據(jù):
這里我們實現(xiàn)了簡單的數(shù)據(jù)插入。可以看到,項目中并沒有使用復雜架構(gòu)和復雜的領(lǐng)域驅(qū)動設計,僅引用并配置Abp模塊,即可使用常規(guī)的?ASP.NET Core Web API方式進行開發(fā)。
緩存
接下來我們將繼續(xù)實現(xiàn)緩存功能。
引用Nuget包Volo.Abp.Caching并向LightweightAbpModule添加AbpCachingModule模塊依賴;
修改IBookAppService及BookAppService實現(xiàn)GetAllAsync方法:
修改BookAppService實現(xiàn)GetAllAsyncAPI接口:
F5以調(diào)試方式運行,即可調(diào)用實現(xiàn)了緩存功能的GetAllAsync接口。
這里我們實現(xiàn)了緩存功能。顯而易見,按需使用緩存功能所在的Nuget包及模塊即可,并沒有很多繁雜的操作。
眾所周知,Abp實現(xiàn)了相當多的功能,其中有些功能也許整個項目生命周期中都不會用到。得益于模塊化的方式,我們可以只依賴我所需要的Nuget包和Abp模塊。如果根據(jù)功能多少來評判框架的“輕”和“重”,我們按需依賴不同模塊時Abp框架不可謂不輕。由此可見,一個框架的“輕”和“重”,有時還會取決于使用方式。
上手難度及易用性
學習一門新技術(shù)最好的起點便是官方文檔,Abp也是如此,Abp的官方文檔非常詳盡介紹了各個功能。Abp還為我們提供了啟動模板,模板遵循了領(lǐng)域驅(qū)動設計的最佳實踐來進行項目分層,并且為我們繼承了很多項目中常用的功能模塊。
對于初學者而言,面對一個復雜的分層架構(gòu)及豐富的功能特性支持,一瞬間需要接受非常多的知識,因此會產(chǎn)生無從下手的感覺,進而得出一種上手難度高,框架很“重”的結(jié)論。
如果從另外一種角度來學習Abp的話,也許情況會有所不同。在本文之初,我便提出了Abp的核心是模塊化及依賴注入的觀點,當我們將入門的重點放在模塊化和依賴注入上,那么會發(fā)現(xiàn)Abp是一個極易上手并且學習曲線很平緩的框架。正如上文我所進行的代碼演示,如果感覺這個演示項目簡單易學,那么就證明了我這一觀點。
至于易用性,首先Abp實現(xiàn)的功能很全面,我們可以按需使用;其次,隨著對Abp框架的逐步深入,會發(fā)現(xiàn)模塊化的設計讓我們的項目集成多種功能變得簡單,并且隨著項目的演進,Abp的模塊化給我們提供了輕易切換到微服務方案的能力;依賴注入系統(tǒng)讓我們能夠輕易的定制并替換Abp默認實現(xiàn)的功能。因此,我認為Abp是一個易于使用的框架。
總結(jié)
在這里我們從一個不同的角度來認識了Abp框架,顯而易見,對于Abp來講,是否太“重”,和我們對他的認知及使用方式有很大的關(guān)聯(lián)。
項目示例代碼將托管在Github中。
致謝
感謝Abp群(QQ群:48039003)的群友們提供的熱心幫助。
總結(jié)
以上是生活随笔為你收集整理的Abp太重了?轻量化Abp框架的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Orchard Core 1.0.0 正
- 下一篇: 避不开的分布式事务