?
概述
應用層是基于領域的應?程序用例的實現,應?程序?例可以看作是?戶界?上的?戶交互。這一篇,我將詳細講解應用層組件及用法。
總覽
應用層包含以下組件:
數據傳輸對象(DTO):數據傳輸對象是一個簡單的對象,不包含任何業務邏輯,用于在應用程序和表示層之間數據傳輸,當我們使用動態WebApi機制時,DTO會作為HTTP API接口傳入傳出參數。
應用服務(Application Service):應用服務是一個實現應用程序用例的無狀態服務。應用程序服務通常獲取并返回DTO。在ABP框架中,我們可以將其配置為動態WebApi。
工作單元(UOW):工作單元是一個應該作為一個事務單元來完成的原子工作。UOW內部的所有操作都應該在成功時提交,或者在失敗時回滾。
在ABP框架下,應用層包含以下兩個項目:
Application.Contracts項目包含應用服務接口和這些接口所使用的DTO。
Application項目是實現在Contracts項目中定義的接口的基本應用層。
實現細節
1
數據傳輸對象
在ABP框架下所有數據傳輸對象均需實現?IEntityDto?接口,ABP提供了該接口的默認實現類?EntityDto?。
EntityDto有泛型和非泛型兩種方式,泛型方式即?EntityDto<TKey>?會默認包含該泛型類型的ID,通常和實體中的ID做對應。如果我們不需要傳遞ID作為參數,則可以使用無泛型的方式作為DTO基類。
和實體定義相似,ABP為DTO同樣定義了包含審計字段的EntityDto基類,?CreationAuditedEntityDto?包含記錄對象添加時間和添加人的信息,?AuditedEntityDto?包含最后修改時間和修改人,?FullAuditedEntityDto?包含增刪改的所有記錄。
2
應用服務
在ABP框架規范中,應用服務接口繼承自?IApplicationService?,存放于?Application.Contracts?項目中;其實現類繼承自?ApplicationService?存放于?Application?項目中。
在?ApplicationService?基類中,ABP框架默認添加了一些屬性對象用于服務方法中調用,這里介紹幾個比較常用的屬性用途:
CurrentTenant/CurrentUser:
當前租戶/當前用戶,在應用服務中可以使用它們獲取當前調用者的租戶信息和用戶信息。
ObjectMapper:
用于配合AutoMapper實現對象映射。
ServiceProvider:
在使用依賴注入時,除常規的構造方法注入、屬性注入等方式外,也可以使用ApplicationService中注入的ServiceProvider對象來獲取實例。
GuidGenerator:
ABP框架提供了一種有序GUID的生成方案,IGuidGenerator是這種方式的接口聲明,而在ApplicationService中,ABP默認注入了GuidGenerator對象用于服務內使用。
UnitOfWorkManager:
用于工作單元處理,其中Current屬性代表當前的工作單元。
在ABP中,還提供了實現默認增刪改查方法的類?CrudAppService?,其接口定義為?ICrudAppService?。如果我們的應用服務需要實現增刪改查,可直接繼承自此類,其中主要包含以下方法:
CreateAsync:
用于添加數據并返回添加后的結果。使用動態WebApi時,該方法會被封裝成POST方式HTTP API接口。當實體使用Guid作為主鍵時,如果接口調用者傳入主鍵,則使用此主鍵,否則會使用GuidGenerator生成有序主鍵,如無特殊需求建議使用后者。
UpdateAsync:
用于修改數據并返回修改后的結果,其方法包含兩個參數:id表示需要修改的數據的ID,input為需要修改的對象。使用動態WebApi時,該方法會被封裝成PUT方式HTTP API接口。
DeleteAsync:
依據ID刪除數據。使用動態WebApi時,該方法會被封裝成DELETE方式HTTP API接口。
GetAsync:
依據ID獲取單條數據。使用動態WebApi時,該方法會被封裝成GET方式HTTP API接口。
GetListAsync:
用于獲取數據集合。使用動態WebApi時,該方法會被封裝成GET方式HTTP API接口。通常情況,我們可以使用?
PagedAndSortedResultRequestDto
?作為參數類型,可自動實現排序和分頁,如果我們不需要排序,也可以使用?
PagedResultRequestDto
?作為參數類型。如果我們希望添加數據過濾條件,可以重寫CrudAppService中的?
CreateFilteredQueryAsync
?方法。
ABP中,應用服務默認使用AppService結尾,生成動態WebApi時,會自動去掉此后綴。
注意:ABP生成動態WebAPI是依據應用服務的實現類,而如果使用動態客戶端代理,是依據應用服務的接口聲明。所以需要保證應用服務接口和實現的參數命名嚴格一致,否則使用動態客戶端代理時無法正確傳遞參數。
3
工作單元
工作單元是對應用程序中數據庫連接和事務范圍的抽象和控制。默認情況下,ABP每個應用服務方法都是一個工作單元,除基礎的工作單元控制外,我們也可以通過在調用倉儲增刪改方法時將autoSave參數設置為True來強制提交數據。
除此之外,我們可以通過特性?[UnitOfWork]?控制工作單元的啟用和停用。
在第2章中,我們提到了UnitOfWorkManager對象,在應用服務中,我們可以通過此對象獲取當前工作單元或者創建新的工作單元。
4
對象映射關系
除了DDD中定義的各種組件外,我們在ABP vNext框架下編寫應用服務時,還需要創建DTO和實體類之間的映射關系,作為AutoMapper框架對象映射的依據。
此代碼位于Application項目中以【項目名+ApplicationAutoMapperProfile】命名的類中,在構造方法中,我們可以直接調用?CreateMap<TSource, TDestination>?方法創建TSource到TDestination類型的映射關系。