ABP開(kāi)發(fā)框架前后端開(kāi)發(fā)系列---(16)ABP框架升級(jí)最新版本的經(jīng)驗(yàn)總結(jié)

有一小段時(shí)間沒(méi)有持續(xù)升級(jí)ABP框架了,最近就因應(yīng)客戶的需要,把ABP框架進(jìn)行全面的更新,由于我們應(yīng)用的ABP框架,基礎(chǔ)部分還是會(huì)使用官方的內(nèi)容,因此升級(jí)的時(shí)候需要把官方基礎(chǔ)ABP的DLL進(jìn)行全面的更新,以及對(duì)應(yīng)的引用DLL也同步更新才行。不過(guò)在升級(jí)過(guò)程中還是很多奇奇怪怪的問(wèn)題,本篇隨筆針對(duì)出現(xiàn)的情況進(jìn)行一系列的總結(jié),以便后面有一個(gè)對(duì)照參考吧。

1、最新案例源碼和NugGet程序包更新

ABP官方的基礎(chǔ)模塊更新速度還是很快的,一段時(shí)間過(guò)去,就跳過(guò)了幾個(gè)版本號(hào),我是在舊版本的基礎(chǔ)上進(jìn)行手動(dòng)的NugGet更新,但是基于VS的Nugget總是更新卡頓,不知不覺(jué)就沒(méi)有反應(yīng)了,嚴(yán)重影響開(kāi)發(fā)的效率。因此先從官方下載的Demo案例中把相關(guān)部分源碼進(jìn)行更新。

官方的案例源碼下載地址是:https://aspnetboilerplate.com/Templates

1)最新案例源碼結(jié)構(gòu)和部分內(nèi)容調(diào)整

我們從其中下載對(duì)應(yīng)的源碼,然后根據(jù)項(xiàng)目結(jié)構(gòu)中的對(duì)應(yīng)源碼文件,使用Beyond Compare對(duì)比文件進(jìn)行文件逐一對(duì)比,原則上除了個(gè)人擴(kuò)展的部分,都以官方的源碼做法為準(zhǔn)即可。

目前ABP官方最新的DLL版本是5.3.0,可以下載的Demo版本是5.2.0,它們應(yīng)該差別不大。下載下來(lái)的Aspnet-core部分的源碼結(jié)構(gòu)如下所示。

image

而我們的ABP框架是在這個(gè)基礎(chǔ)上進(jìn)行一定的結(jié)構(gòu)優(yōu)化,以更加方便快速的開(kāi)發(fā),以及結(jié)合代碼生成工具進(jìn)行快速的使用。

我們的VS項(xiàng)目結(jié)構(gòu) 如下所示。

image

以上是VS里面解決方案的項(xiàng)目結(jié)構(gòu),我根據(jù)項(xiàng)目之間的關(guān)系,整理了一個(gè)架構(gòu)的圖形,如下所示。

image

上圖中,其中橘紅色部分就是我們?yōu)楦鱾€(gè)層添加的類或者接口,分層上的序號(hào)是我們需要逐步處理的內(nèi)容。

應(yīng)用服務(wù)層是整個(gè)ABP框架的靈魂所在,對(duì)內(nèi)協(xié)同倉(cāng)儲(chǔ)對(duì)象實(shí)現(xiàn)數(shù)據(jù)的處理,對(duì)外配合Web.Core、Web.Host項(xiàng)目提供Web API的服務(wù),而Web.Core、Web.Host項(xiàng)目幾乎不需要進(jìn)行修改,因此應(yīng)用服務(wù)層就是一個(gè)非常關(guān)鍵的部分,需要考慮對(duì)用戶登錄的驗(yàn)證、接口權(quán)限的認(rèn)證、以及對(duì)審計(jì)日志的記錄處理,以及異常的跟蹤和傳遞,基本上應(yīng)用服務(wù)層就是一個(gè)大內(nèi)總管的角色,重要性不言而喻。

image

回顧了解一下我們改造過(guò)的ABP開(kāi)發(fā)框架的結(jié)構(gòu)后,我們返回到版本升級(jí)的主體上來(lái)介紹。

目前我把VS的版本升級(jí)到最新,其.net framework支持4.8, 并單獨(dú)安裝了dotnetcore最新版本3.1,因此環(huán)境是最新的,而基礎(chǔ)的ABP 5.3.0也是采用了.net core3.1。

對(duì)比源碼,我們可以發(fā)現(xiàn),Web.Host和Web.Core項(xiàng)目里面已經(jīng)有所差異,IHostingEnvironment已經(jīng)被拋棄使用,而采用dotnetcore最新對(duì)象IWebHostEnvironment來(lái)替代了。

image

替換最新源碼為

image

因此Web.Host項(xiàng)目中的Module類也進(jìn)行了調(diào)整。

image

相對(duì)應(yīng)的Web.Core項(xiàng)目里面的Module也同時(shí)進(jìn)行調(diào)整了。

image

2)NugGet程序包更新

Nugget程序包的更新,原則上可以選擇單個(gè)項(xiàng)目進(jìn)行更新,或者選擇整個(gè)解決方案進(jìn)行程序包的更新,前者可能相應(yīng)速度快一些,后者由于解決方案項(xiàng)目數(shù)量問(wèn)題,可能會(huì)較慢。

我早期的基礎(chǔ)ABP版本是4.9,因此想一次性整個(gè)的解決方案的程序包進(jìn)行更新,不過(guò)嘗試多次,花了幾個(gè)小時(shí),都無(wú)法順利進(jìn)行項(xiàng)目的全部更新,于是單個(gè)項(xiàng)目進(jìn)行更新,也非常慢。

于是也通過(guò)推薦采用Nugget最新地址進(jìn)行更新,如下設(shè)置更新源。

image

在程序包源中添加:https://api.nuget.org/v3/index.json

image

響應(yīng)速度相對(duì)快了一些,沒(méi)有不經(jīng)常的出問(wèn)題了。

我們?nèi)绻枰獑为?dú)更新某個(gè)項(xiàng)目的程序包,那么需要選擇項(xiàng)目,選擇【管理Nugget程序包】進(jìn)入界面更新即可。如下界面所示。

image
image

一般情況下,我們推薦對(duì)整個(gè)解決方案進(jìn)行全面的程序包更新,如下選擇解決方案,然后進(jìn)入對(duì)應(yīng)Nugget程序包管理界面更新即可。

image

這樣的全部更新解決方案的程序包,如果能夠順利完成,那是皆大歡喜,不過(guò)可能會(huì)稍微慢一些。如果不行,只有逐個(gè)更新程序包了。

我之前選擇這樣的方式更新的時(shí)候,總是有一兩個(gè)程序包更新出錯(cuò),因此只有使用npm 控制臺(tái)進(jìn)行單獨(dú)的升級(jí)了。

image

2、ABP框架基類封裝接口命名調(diào)整

在更新ABP基礎(chǔ)模塊的時(shí)候,發(fā)現(xiàn)ABP的基礎(chǔ)接口全部調(diào)整了命名,如原來(lái)的Get變?yōu)镚etAsync,GetAll變?yōu)?GetAllAsync,Delete變?yōu)榱薉eleteAsync,Update變?yōu)榱薝pdateAsync,Create變?yōu)榱薈reateAsync。

也就是說(shuō),他們?nèi)坎捎昧水惒矫Q的命名規(guī)則,在異步方法后面全部加上了Async作為標(biāo)識(shí)。

我在之前模塊介紹過(guò)ABP框架的基礎(chǔ)接口。IAsyncCrudAppService定義了幾個(gè)通用的創(chuàng)建、更新、刪除、獲取單個(gè)對(duì)象和獲取所有對(duì)象列表的接口,接口定義如下所示。

namespace Abp.Application.Services
{
    public interface IAsyncCrudAppService<TEntityDto, TPrimaryKey, in TGetAllInput, in TCreateInput, in TUpdateInput, in TGetInput, in TDeleteInput> : IApplicationService, ITransientDependency
        where TEntityDto : IEntityDto<TPrimaryKey>
        where TUpdateInput : IEntityDto<TPrimaryKey>
        where TGetInput : IEntityDto<TPrimaryKey>
        where TDeleteInput : IEntityDto<TPrimaryKey>
    {
        Task<TEntityDto> Create(TCreateInput input);
        Task Delete(TDeleteInput input);
        Task<TEntityDto> Get(TGetInput input);
        Task<PagedResultDto<TEntityDto>> GetAll(TGetAllInput input);
        Task<TEntityDto> Update(TUpdateInput input);
    }
}

現(xiàn)在這些接口全部調(diào)整如下所示了。

namespace Abp.Application.Services
{
    public interface IAsyncCrudAppService<TEntityDto, TPrimaryKey, in TGetAllInput, in TCreateInput, in TUpdateInput, in TGetInput, in TDeleteInput> : IApplicationService, ITransientDependency
        where TEntityDto : IEntityDto<TPrimaryKey>
        where TUpdateInput : IEntityDto<TPrimaryKey>
        where TGetInput : IEntityDto<TPrimaryKey>
        where TDeleteInput : IEntityDto<TPrimaryKey>
    {
        Task<TEntityDto> CreateAsync(TCreateInput input);
        Task DeleteAsync(TDeleteInput input);
        Task<PagedResultDto<TEntityDto>> GetAllAsync(TGetAllInput input);
        Task<TEntityDto> GetAsync(TGetInput input);
        Task<TEntityDto> UpdateAsync(TUpdateInput input);
    }
}

那么這些我們都必須隨著ABP框架的調(diào)整也同時(shí)進(jìn)行接口和對(duì)應(yīng)類實(shí)現(xiàn)的調(diào)整了。

例如對(duì)應(yīng)的異步ApplicationService服務(wù)的基類封裝,我們也需要調(diào)整對(duì)應(yīng)的異步接口實(shí)現(xiàn)。

image

針對(duì)遠(yuǎn)程調(diào)用的ApiCaller接口和實(shí)現(xiàn),我們也需要進(jìn)行命名方面的統(tǒng)一調(diào)整,這樣才能順利進(jìn)行異步接口的調(diào)用

image

我在之前隨筆《ABP開(kāi)發(fā)框架前后端開(kāi)發(fā)系列---(10)Web API調(diào)用類的簡(jiǎn)化處理》有針對(duì)API調(diào)用層的簡(jiǎn)化處理做了說(shuō)明,我們所有的API調(diào)用,基本都是通過(guò)統(tǒng)一的一個(gè)函數(shù)進(jìn)行調(diào)用的。

統(tǒng)一調(diào)用處理的方法名稱是DoActionAsync。

image

雖然由于前面介紹了應(yīng)用服務(wù)層的接口很多接口增加了Async的后綴字符,但是客戶端通過(guò)URL調(diào)用,這個(gè)Async是不需要的,也就是需要移除,我們之前組裝的URL地址是根據(jù)函數(shù)名稱,那么函數(shù)名稱需要移除這個(gè)后綴的Async字樣了。

image

這樣系統(tǒng)就順利跑起來(lái)了。服務(wù)端界面如下所示。

image

我們啟動(dòng)Winform客戶端,界面如下所示。

image

登陸啟動(dòng)后主體界面如下所示

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,494評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 176,283評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 62,953評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,714評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 55,186評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 42,410評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,940評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,776評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,976評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,210評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 34,642評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 35,878評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,654評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,958評(píng)論 2 373