初識ABP vNext(12):模組的獨立執行與託管
阿新 • • 發佈:2020-10-30
Tips:本篇已加入系列文章閱讀目錄,可點選檢視更多相關文章。
[TOC]
# 前言
很久沒更新這個系列。。。之前的章節中講到ABP的模組是可以獨立執行的,但是沒有介紹具體怎麼操作,本篇就來討論一下模組如何獨立執行,以及一些託管方式。本人也是處於摸索階段,如有不對歡迎指出。
# 開始
## 模組執行
首先需要生成模組的資料庫,修改`HttpApi.Host`和`IdentityServer`專案的`appsettings.json`資料庫連線字串配置。
![](https://img2020.cnblogs.com/blog/610959/202010/610959-20201029112031658-1016178286.png)
\modules\file-management\host\Xhznl.FileManagement.HttpApi.Host\appsettings.json:
![](https://img2020.cnblogs.com/blog/610959/202010/610959-20201029113717428-546963758.png)
\modules\file-management\host\Xhznl.FileManagement.IdentityServer\appsettings.json:
![](https://img2020.cnblogs.com/blog/610959/202010/610959-20201029113739190-1920028055.png)
這樣會生成2個數據庫,如果你只需要一個數據庫的話,就把`FileManagement`的那行配置去掉就好了。
開啟程式包管理器控制檯,預設專案選擇`IdentityServer`,執行`update-database`
![](https://img2020.cnblogs.com/blog/610959/202010/610959-20201029114515532-434053586.png)
執行完成會生成Main資料庫,其中是一些ABP的基礎表。
![](https://img2020.cnblogs.com/blog/610959/202010/610959-20201029114704548-1409262071.png)
繼續將預設專案設定為`HttpApi.Host`執行`add-migration Initial` `update-database`
![](https://img2020.cnblogs.com/blog/610959/202010/610959-20201029115522213-2002189719.png)
執行完成會生成Module資料庫,其中是你模組的相關表。
![](https://img2020.cnblogs.com/blog/610959/202010/610959-20201029121619379-1941514745.png)
此時這兩個專案就可以正常運行了。
![](https://img2020.cnblogs.com/blog/610959/202010/610959-20201029122409085-256684635.png)
![](https://img2020.cnblogs.com/blog/610959/202010/610959-20201029122421448-1862298157.png)
專案中可能有多個模組相互協作,如果將各個模組獨立執行的話,不可能每個模組都建立一個Main資料庫,所以部分ABP的通用模組的資料庫表就用同一個就好了。
\modules\file-management\host\Xhznl.FileManagement.HttpApi.Host\appsettings.json:
![](https://img2020.cnblogs.com/blog/610959/202010/610959-20201029130757297-1385112816.png)
\modules\file-management\host\Xhznl.FileManagement.IdentityServer\appsettings.json:
![](https://img2020.cnblogs.com/blog/610959/202010/610959-20201029130820846-870785924.png)
## 動態 C# API 客戶端
當有多個獨立部署的模組時,可能需要做一些閘道器之類的來統一入口,模組之間的相互呼叫也比較麻煩,本篇暫不討論。下面介紹一下如何使用ABP的動態C# API客戶端來呼叫遠端模組。
> ABP可以自動建立C# API 客戶端代理來呼叫遠端HTTP服務(REST APIS).通過這種方式,你不需要通過 `HttpClient` 或者其他低階的HTTP功能呼叫遠端服務並獲取資料.
前面的章節中,在主專案中將模組的`Application`層和`Domain`層的大部分專案都引用了一遍,那種方式是單體部署的情況,模組和主專案託管在同一個程序裡。
下面使用C# API客戶端來代理遠端模組。
首先刪除專案中模組的引用和`DependsOn`
![](https://img2020.cnblogs.com/blog/610959/202010/610959-20201029190838112-2059454260.png)
然後在你需要呼叫模組的專案中,新增模組的`HttpApi.Client`專案的依賴即可。比如我這裡的`Xhznl.HelloAbp.HttpApi.Host`專案:
![](https://img2020.cnblogs.com/blog/610959/202010/610959-20201029191326754-462511767.png)
然後`DependsOn`:
![](https://img2020.cnblogs.com/blog/610959/202010/610959-20201029191536899-408332689.png)
然後在`appsettings.json`中新增遠端服務的地址配置:
![](https://img2020.cnblogs.com/blog/610959/202010/610959-20201029191720509-1722374039.png)
其中的`FileManagement`這個名稱是來自模組的`HttpApi.Client`專案中的定義:
![](https://img2020.cnblogs.com/blog/610959/202010/610959-20201029191901621-2117657607.png)
接下來就可以像使用本地方法一樣去使用遠端服務了,因為`HttpApi.Client`是依賴於`Application.Contracts`專案的,所以你模組的所有服務介面都可以在這裡使用,直接注入即可(前提是你的服務需要實現`IRemoteService`),ABP會自動幫你完成Http的遠端呼叫。隨便找個地方測試一下:
![](https://img2020.cnblogs.com/blog/610959/202010/610959-20201029192852827-709797232.png)
接下來是模組專案,最好配合ABP的自動API控制器一起使用,如果你是自定義路由的話,可能會出現一些`Could not found remote action`的奇怪錯誤。
![](https://img2020.cnblogs.com/blog/610959/202010/610959-20201029192224672-613511655.png)
Auth服務地址也注意一下:
![](https://img2020.cnblogs.com/blog/610959/202010/610959-20201029194403458-1084837062.png)
下面給兩個專案打上斷點,測試一下流程是否正確:
![](https://img2020.cnblogs.com/blog/610959/202010/610959-20201029194635682-187731539.png)
![](https://img2020.cnblogs.com/blog/610959/202010/610959-20201029194720013-787059653.png)
可以看到,請求已經正常流轉到模組專案中。
上面有些亂,總結一下重點:
1. 新增`HttpApi.Client`引用
2. 新增`RemoteServices`地址配置
3. 注入服務介面進行使用
如果想託管模組的所有API,那麼只需要再新增模組的`HttpApi`依賴即可。託管方式非常靈活,具體可以參考:[模組化架構最佳實踐 & 約定](https://docs.abp.io/zh-Hans/abp/latest/Best-Practices/Module-Architecture)
# 最後
本篇就到這裡。。。