ABP開發框架前後端開發系列---(16)ABP框架升級最新版本的經驗總結

来源:https://www.cnblogs.com/wuhuacong/archive/2020/03/09/12447044.html
-Advertisement-
Play Games

有一小段時間沒有持續升級ABP框架了,最近就因應客戶的需要,把ABP框架進行全面的更新,由於我們應用的ABP框架,基礎部分還是會使用官方的內容,因此升級的時候需要把官方基礎ABP的DLL進行全面的更新,以及對應的引用DLL也同步更新才行。不過在升級過程中還是很多奇奇怪怪的問題,本篇隨筆針對出現的情況... ...


有一小段時間沒有持續升級ABP框架了,最近就因應客戶的需要,把ABP框架進行全面的更新,由於我們應用的ABP框架,基礎部分還是會使用官方的內容,因此升級的時候需要把官方基礎ABP的DLL進行全面的更新,以及對應的引用DLL也同步更新才行。不過在升級過程中還是很多奇奇怪怪的問題,本篇隨筆針對出現的情況進行一系列的總結,以便後面有一個對照參考吧。

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

ABP官方的基礎模塊更新速度還是很快的,一段時間過去,就跳過了幾個版本號,我是在舊版本的基礎上進行手動的NugGet更新,但是基於VS的Nugget總是更新卡頓,不知不覺就沒有反應了,嚴重影響開發的效率。因此先從官方下載的Demo案例中把相關部分源碼進行更新。

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

1)最新案例源碼結構和部分內容調整

我們從其中下載對應的源碼,然後根據項目結構中的對應源碼文件,使用Beyond Compare對比文件進行文件逐一對比,原則上除了個人擴展的部分,都以官方的源碼做法為準即可。

目前ABP官方最新的DLL版本是5.3.0,可以下載的Demo版本是5.2.0,它們應該差別不大。下載下來的Aspnet-core部分的源碼結構如下所示。

而我們的ABP框架是在這個基礎上進行一定的結構優化,以更加方便快速的開發,以及結合代碼生成工具進行快速的使用。

我們的VS項目結構 如下所示。

以上是VS裡面解決方案的項目結構,我根據項目之間的關係,整理了一個架構的圖形,如下所示。

 上圖中,其中橘紅色部分就是我們為各個層添加的類或者介面,分層上的序號是我們需要逐步處理的內容。

應用服務層是整個ABP框架的靈魂所在,對內協同倉儲對象實現數據的處理,對外配合Web.Core、Web.Host項目提供Web API的服務,而Web.Core、Web.Host項目幾乎不需要進行修改,因此應用服務層就是一個非常關鍵的部分,需要考慮對用戶登錄的驗證、介面許可權的認證、以及對審計日誌的記錄處理,以及異常的跟蹤和傳遞,基本上應用服務層就是一個大內總管的角色,重要性不言而喻。

回顧瞭解一下我們改造過的ABP開發框架的結構後,我們返回到版本升級的主體上來介紹。

目前我把VS的版本升級到最新,其.net framework支持4.8, 並單獨安裝了dotnetcore最新版本3.1,因此環境是最新的,而基礎的ABP 5.3.0也是採用了.net core3.1。

對比源碼,我們可以發現,Web.Host和Web.Core項目裡面已經有所差異,IHostingEnvironment已經被拋棄使用,而採用dotnetcore最新對象IWebHostEnvironment來替代了。

 替換最新源碼為

因此Web.Host項目中的Module類也進行了調整。

相對應的Web.Core項目裡面的Module也同時進行調整了。

 

2)NugGet程式包更新

Nugget程式包的更新,原則上可以選擇單個項目進行更新,或者選擇整個解決方案進行程式包的更新,前者可能相應速度快一些,後者由於解決方案項目數量問題,可能會較慢。

我早期的基礎ABP版本是4.9,因此想一次性整個的解決方案的程式包進行更新,不過嘗試多次,花了幾個小時,都無法順利進行項目的全部更新,於是單個項目進行更新,也非常慢。

於是也通過推薦採用Nugget最新地址進行更新,如下設置更新源。

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

 

 響應速度相對快了一些,沒有不經常的出問題了。

我們如果需要單獨更新某個項目的程式包,那麼需要選擇項目,選擇【管理Nugget程式包】進入界面更新即可。如下界面所示。

一般情況下,我們推薦對整個解決方案進行全面的程式包更新,如下選擇解決方案,然後進入對應Nugget程式包管理界面更新即可。

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

我之前選擇這樣的方式更新的時候,總是有一兩個程式包更新出錯,因此只有使用npm 控制台進行單獨的升級了。

 

2、ABP框架基類封裝介面命名調整

在更新ABP基礎模塊的時候,發現ABP的基礎介面全部調整了命名,如原來的Get變為GetAsync,GetAll變為 GetAllAsync,Delete變為了DeleteAsync,Update變為了UpdateAsync,Create變為了CreateAsync。

也就是說,他們全部採用了非同步名稱的命名規則,在非同步方法後面全部加上了Async作為標識。

我在之前模塊介紹過ABP框架的基礎介面。IAsyncCrudAppService定義了幾個通用的創建、更新、刪除、獲取單個對象和獲取所有對象列表的介面,介面定義如下所示。

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);
    }
}

現在這些介面全部調整如下所示了。

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框架的調整也同時進行介面和對應類實現的調整了。

例如對應的非同步ApplicationService服務的基類封裝,我們也需要調整對應的非同步介面實現。

針對遠程調用的ApiCaller介面和實現,我們也需要進行命名方面的統一調整,這樣才能順利進行非同步介面的調用 

 我在之前隨筆《ABP開發框架前後端開發系列---(10)Web API調用類的簡化處理》有針對API調用層的簡化處理做了說明,我們所有的API調用,基本都是通過統一的一個函數進行調用的。

統一調用處理的方法名稱是DoActionAsync。

雖然由於前面介紹了應用服務層的介面很多介面增加了Async的尾碼字元,但是客戶端通過URL調用,這個Async是不需要的,也就是需要移除,我們之前組裝的URL地址是根據函數名稱,那麼函數名稱需要移除這個尾碼的Async字樣了。

這樣系統就順利跑起來了。服務端界面如下所示。

 

 

 我們啟動Winform客戶端,界面如下所示。

 

登陸啟動後主體界面如下所示

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先先思考下如果不使用DropdownList控制項,如何將一個List集合中的數據通過下拉框(select標簽)的形式顯示? 使用下拉框(純select方式)實現分類數據的顯示 步驟: 處理後端: ①在後端代碼中定義一個公開的userID變數,用於保存url中獲取到的userID public st ...
  • 帶著問題去思考,大家好! WebAPI核心任務是什麼?它的核心機制又是什麼? 核心任務是處理HTTP請求並提供適當的響應。 1 消息流概覽 HTTP消息流的框架組件大致分2種 依靠HTTP消息獲得上下文的組件 依靠高層編程模型獲得上下文 第一層組件只依靠來自底層“消息處理程式”管道的核心HTTP消息 ...
  • 1.簡介 每個上下文實例都有一個ChangeTracker,它負責跟蹤需要寫入資料庫的更改。更改實體類的實例時,這些更改會記錄在ChangeTracker中,然後在調用SaveChanges時會被寫入資料庫中。此資料庫提供程式負責將更改轉換為特定於資料庫的操作(例如,關係資料庫的INSERT、UPD ...
  • 日期:2020.03.09 15:58 1、傳遞到ref參數的實參參數必須先初始化,方法內也可該值 2、傳遞至out參數的實參可以不初始化,因為即使初始化實參,out方法中也無法取得該值,但在方法中必須初始化(即使參數不被使用) 3、無法同時使用ref和out方法,不可以同時重載 4、一個方法中可以 ...
  • 在資料庫庫存儲的布爾值: 但在前端Angularjs給布爾值卻是"true" and "false"。 因此你值去顯示服務端的布爾值時,也許永遠得到的是false值。 所以,Insus.NET在開發過程中,得寫一個Service來進行轉換: 'use strict'; app.service('co ...
  • 如下圖示例: 前端在引用這個2個Action時,POST單個對象,或多個對象作為參數傳至服務端的API。 傳單外對象: var _obj = {}; _obj.Item_Code = code; $http({ method: 'POST', url: '/Item/Delete/', dataTy ...
  • WPF Core發佈有個文件發佈選項:生成單個文件,自動升級就比較方便了。 一、下載新版本程式,保存為...Exe~,並運行 二、替換老版本並運行 ...
  • 先簡單介紹下項目(由於重新基於模塊化設計了整個項目,所以目前整個項目功能不多) 1.Asp.Net Core 3.1.2+MSSQL2019(LINUX版) 2.中間件涉及Redis、RabbitMQ等 3.完全模塊化的設計,支持每個模塊有獨立的靜態資源文件 github開源地址: https:// ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...