單層應用升級到多層應用3

接上文,我們已經初步完成了單層到多層的拆分,接下來就是再優化我們的結構了。

升級思路

在前文的Core項目中,包含了我們所有的基礎功能,但是有些項目可能只需要部分功能卻引用整一塊Core的話,會顯得有些多餘,需要將這部分基礎設施再做一下細緻化的拆分。
在Host項目中,仍舊還有許多功能代碼沒有拆分,如EventBus,FileStoreages, Authorization,Localization等,這部分又算基礎設施功能,一部分又有一定的業務屬性。需要將這些功能抽象拆分出來。

開始遷移

再來回顧我們單層的目錄結構,如圖:
image.png

抽離DependencyInjection

首先考慮依賴注入的基礎功能,這一部分是最通用的,完全可以單獨放在一塊。
新建類庫Wheel.DependencyInjection,將三個依賴注入的接口遷移過去。很簡單。
image.png

抽離Authorization

在上一篇文章中,我們的Authorization相關的代碼還是放在Host中,但是這一塊可以完全剝離處理,裏面只包含:IPermissionChecker,PermissionAuthorizationHandler,PermissionAuthorizationPolicyProvider和PermissionAuthorizationRequirement四個代碼文件。
新建類庫Wheel.Authorization,把4個代碼文件遷移過去,這裏不包含IPermissionChecker的實現。需要依賴Wheel.DependencyInjection類庫完成來做依賴注入。
image.png

抽離Cache

緩存也是屬於非常基礎的功能,按需引用來使用。
新建類庫Wheel.Cache,將Cache中的文件遷移過去。無需依賴其他項目引用。

抽離User

ICurrentUser是根據請求獲取當前用戶數據的接口,也是根據業務場景使用的玩意。這裏也抽出來。
新建一個類庫Wheel.Users,將CurrentUser和ICurrentUser文件遷移過去。這裏由於CurrentUser用到了IHttpContextAccessor來獲取Http請求上下文,是Asp.Net Cored的API,需要在項目文件中添加Asp.Net Core的框架依賴:

<ItemGroup>
  <FrameworkReference Include="Microsoft.AspNetCore.App"></FrameworkReference>
</ItemGroup>

抽離Permissions

前面我們抽離Authorization的時候沒有把IPermissionChecker的實現遷移過去,這裏是把實現放在Permissions中。
新建類庫Wheel.Permissions,依賴引用Authorization,Cache和Users。把PermissionChecker遷移到類庫。

抽離Utilities

Utilities是我們的一些工具類。非常適合抽離出來單獨引用。
新建類庫Wheel.Utilities,依賴DependencyInjection,然後將Utilities目錄中的文件遷移過來。
image.png

抽離EventBus

我們的EventBus分成了LocalEventBus和DistributedEventBus,同時又有不同的實現。所以這裏EventBus則是按照實現來拆分成多個類庫。
首先把基礎接口抽離單獨一個類庫Wheel.EventBus:
image.png
這裏包括了EventBus和Handler的相關接口。
然後我們按照實現分別再新建類庫。

Wheel.EventBus.Cap

新建類庫Wheel.EventBus.Cap,依賴引用Wheel.EventBus項目,然後把CAP實現代碼遷移到這個項目中。
image.png

Wheel.EventBus.MediatR

新建類庫Wheel.EventBus.MediatR,依賴引用Wheel.EventBus項目,然後把MediatR實現代碼遷移到這個項目中。
image.png

Wheel.EventBus.Channels

新建類庫Wheel.EventBus.Channels,依賴引用Wheel.EventBus項目,然後把Channels實現代碼遷移到這個項目中。
image.png
拆分完後,我們後續使用EventBus只需要按照需要引用相關的實現即可。

抽離FileStorages

FileStorages跟EventBus一樣,可能會有多個實現的類型,所以我們也按照EventBus的方式來拆分。
首先是新建一個類庫Wheel.FileStorages,把FileStorages的基礎接口和類遷移進來。
image.png

Wheel.FileStorages.Minio

我們暫時只對接了Minio,所以只新建一個Wheel.FileStorages.Minio類庫,把Minio的實現部分遷移到這裏。
image.png
拆分完後,我們後續使用FileStorages只需要按照需要引用相關的實現即可。

抽離Json

新建一個類庫Wheel.Json,裏面放的是一些JsonConverter,按照需要引用使用即可。
image.png

抽離Localization

新建一個類庫Wheel.Localization,將Localization相關的代碼遷移進來,這裏我們沒有把EFStringLocalizerStore加進來,因爲這部分跟數據庫有關,所以我們把實現還是放在了Host中,相對的添加一個NullStringLocalizerStore作爲默認實現。
image.png

抽離Settings

新建一個類庫Wheel.Settings,這部分跟Localiztion差不多,都需要一個ISettingStore的默認實現。
image.png

最終結構

最終整個解決方案的結構如下圖所示:
image.png

對比最初的單層應用,是否瞬間感覺完全不一樣了。項目結構變得更加清晰,層次更加分明。
同時我們也逐漸形成了我們框架基礎設施的部分。這部分和業務無關,在開發新的業務項目時,這部分基礎設施可以快速的應用到我們的新項目上,大大減少了重複開發基礎設施的工作量。

多層拆分後的代碼地址:https://github.com/Wheel-Framework/Wheel/tree/multi-layer

歡迎進羣催更。

image.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章