初識ABP vNext(12):模塊的獨立運行與託管
Tips:本篇已加入系列文章閱讀目錄,可點擊查看更多相關文章。
前言
很久沒更新這個系列。。。之前的章節中講到ABP的模塊是可以獨立運行的,但是沒有介紹具體怎麼操作,本篇就來討論一下模塊如何獨立運行,以及一些託管方式。本人也是處於摸索階段,如有不對歡迎指出。
開始
模塊運行
首先需要生成模塊的數據庫,修改HttpApi.Host
和IdentityServer
項目的appsettings.json
數據庫連接字符串配置。
\modules\file-management\host\Xhznl.FileManagement.HttpApi.Host\appsettings.json:
\modules\file-management\host\Xhznl.FileManagement.IdentityServer\appsettings.json:
這樣會生成2個數據庫,如果你只需要一個數據庫的話,就把FileManagement
的那行配置去掉就好了。
打開程序包管理器控制台,默認項目選擇IdentityServer
,執行update-database
執行完成會生成Main數據庫,其中是一些ABP的基礎表。
繼續將默認項目設置為HttpApi.Host
執行add-migration Initial
update-database
執行完成會生成Module數據庫,其中是你模塊的相關表。
此時這兩個項目就可以正常運行了。
項目中可能有多個模塊相互協作,如果將各個模塊獨立運行的話,不可能每個模塊都創建一個Main數據庫,所以部分ABP的通用模塊的數據庫表就用同一個就好了。
\modules\file-management\host\Xhznl.FileManagement.HttpApi.Host\appsettings.json:
\modules\file-management\host\Xhznl.FileManagement.IdentityServer\appsettings.json:
動態 C# API 客戶端
當有多個獨立部署的模塊時,可能需要做一些網關之類的來統一入口,模塊之間的相互調用也比較麻煩,本篇暫不討論。下面介紹一下如何使用ABP的動態C# API客戶端來調用遠程模塊。
ABP可以自動創建C# API 客戶端代理來調用遠程HTTP服務(REST APIS).通過這種方式,你不需要通過
HttpClient
或者其他低級的HTTP功能調用遠程服務並獲取數據.
前面的章節中,在主項目中將模塊的Application
層和Domain
層的大部分項目都引用了一遍,那種方式是單體部署的情況,模塊和主項目託管在同一個進程里。
下面使用C# API客戶端來代理遠程模塊。
首先刪除項目中模塊的引用和DependsOn
然後在你需要調用模塊的項目中,添加模塊的HttpApi.Client
項目的依賴即可。比如我這裡的Xhznl.HelloAbp.HttpApi.Host
項目:
然後DependsOn
:
然後在appsettings.json
中添加遠程服務的地址配置:
其中的FileManagement
這個名稱是來自模塊的HttpApi.Client
項目中的定義:
接下來就可以像使用本地方法一樣去使用遠程服務了,因為HttpApi.Client
是依賴於Application.Contracts
項目的,所以你模塊的所有服務接口都可以在這裡使用,直接注入即可(前提是你的服務需要實現IRemoteService
),ABP會自動幫你完成Http的遠程調用。隨便找個地方測試一下:
接下來是模塊項目,最好配合ABP的自動API控制器一起使用,如果你是自定義路由的話,可能會出現一些Could not found remote action
的奇怪錯誤。
Auth服務地址也注意一下:
下面給兩個項目打上斷點,測試一下流程是否正確:
可以看到,請求已經正常流轉到模塊項目中。
上面有些亂,總結一下重點:
- 添加
HttpApi.Client
引用 - 添加
RemoteServices
地址配置 - 注入服務接口進行使用
如果想託管模塊的所有API,那麼只需要再添加模塊的HttpApi
依賴即可。託管方式非常靈活,具體可以參考:模塊化架構最佳實踐 & 約定
最後
本篇就到這裡。。。。。。