接上文,我們已經初步完成了單層到多層的拆分,接下來就是再優化我們的結構了。
升級思路
在前文的Core項目中,包含了我們所有的基礎功能,但是有些項目可能只需要部分功能卻引用整一塊Core的話,會顯得有些多餘,需要將這部分基礎設施再做一下細緻化的拆分。
在Host項目中,仍舊還有許多功能代碼沒有拆分,如EventBus,FileStoreages, Authorization,Localization等,這部分又算基礎設施功能,一部分又有一定的業務屬性。需要將這些功能抽象拆分出來。
開始遷移
再來回顧我們單層的目錄結構,如圖:
抽離DependencyInjection
首先考慮依賴注入的基礎功能,這一部分是最通用的,完全可以單獨放在一塊。
新建類庫Wheel.DependencyInjection,將三個依賴注入的接口遷移過去。很簡單。
抽離Authorization
在上一篇文章中,我們的Authorization相關的代碼還是放在Host中,但是這一塊可以完全剝離處理,裏面只包含:IPermissionChecker,PermissionAuthorizationHandler,PermissionAuthorizationPolicyProvider和PermissionAuthorizationRequirement四個代碼文件。
新建類庫Wheel.Authorization,把4個代碼文件遷移過去,這裏不包含IPermissionChecker的實現。需要依賴Wheel.DependencyInjection類庫完成來做依賴注入。
抽離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目錄中的文件遷移過來。
抽離EventBus
我們的EventBus分成了LocalEventBus和DistributedEventBus,同時又有不同的實現。所以這裏EventBus則是按照實現來拆分成多個類庫。
首先把基礎接口抽離單獨一個類庫Wheel.EventBus:
這裏包括了EventBus和Handler的相關接口。
然後我們按照實現分別再新建類庫。
Wheel.EventBus.Cap
新建類庫Wheel.EventBus.Cap,依賴引用Wheel.EventBus項目,然後把CAP實現代碼遷移到這個項目中。
Wheel.EventBus.MediatR
新建類庫Wheel.EventBus.MediatR,依賴引用Wheel.EventBus項目,然後把MediatR實現代碼遷移到這個項目中。
Wheel.EventBus.Channels
新建類庫Wheel.EventBus.Channels,依賴引用Wheel.EventBus項目,然後把Channels實現代碼遷移到這個項目中。
拆分完後,我們後續使用EventBus只需要按照需要引用相關的實現即可。
抽離FileStorages
FileStorages跟EventBus一樣,可能會有多個實現的類型,所以我們也按照EventBus的方式來拆分。
首先是新建一個類庫Wheel.FileStorages,把FileStorages的基礎接口和類遷移進來。
Wheel.FileStorages.Minio
我們暫時只對接了Minio,所以只新建一個Wheel.FileStorages.Minio類庫,把Minio的實現部分遷移到這裏。
拆分完後,我們後續使用FileStorages只需要按照需要引用相關的實現即可。
抽離Json
新建一個類庫Wheel.Json,裏面放的是一些JsonConverter,按照需要引用使用即可。
抽離Localization
新建一個類庫Wheel.Localization,將Localization相關的代碼遷移進來,這裏我們沒有把EFStringLocalizerStore加進來,因爲這部分跟數據庫有關,所以我們把實現還是放在了Host中,相對的添加一個NullStringLocalizerStore作爲默認實現。
抽離Settings
新建一個類庫Wheel.Settings,這部分跟Localiztion差不多,都需要一個ISettingStore的默認實現。
最終結構
最終整個解決方案的結構如下圖所示:
對比最初的單層應用,是否瞬間感覺完全不一樣了。項目結構變得更加清晰,層次更加分明。
同時我們也逐漸形成了我們框架基礎設施的部分。這部分和業務無關,在開發新的業務項目時,這部分基礎設施可以快速的應用到我們的新項目上,大大減少了重複開發基礎設施的工作量。
多層拆分後的代碼地址:https://github.com/Wheel-Framework/Wheel/tree/multi-layer
歡迎進羣催更。