大話領域驅動設計——應用層

?

概述

0762422ec04fb7d439a2ec684225f415.png

應用層是基于領域的應?程序用例的實現,應?程序?例可以看作是?戶界?上的?戶交互。這一篇,我將詳細講解應用層組件及用法。

總覽

7da5329b002773680445c82cd69565ba.png

應用層包含以下組件:

數據傳輸對象(DTO):數據傳輸對象是一個簡單的對象,不包含任何業務邏輯,用于在應用程序和表示層之間數據傳輸,當我們使用動態WebApi機制時,DTO會作為HTTP API接口傳入傳出參數。

應用服務(Application Service):應用服務是一個實現應用程序用例的無狀態服務。應用程序服務通常獲取并返回DTO。在ABP框架中,我們可以將其配置為動態WebApi。

工作單元(UOW):工作單元是一個應該作為一個事務單元來完成的原子工作。UOW內部的所有操作都應該在成功時提交,或者在失敗時回滾。

b431817329d55e6341c4f4f9605a7790.png

在ABP框架下,應用層包含以下兩個項目:

Application.Contracts項目包含應用服務接口和這些接口所使用的DTO。

Application項目是實現在Contracts項目中定義的接口的基本應用層。

實現細節

1

數據傳輸對象

f68aecc90056885384beddae6775e5c1.gif

在ABP框架下所有數據傳輸對象均需實現?IEntityDto?接口,ABP提供了該接口的默認實現類?EntityDto?。

07b345c8b2a74cc675b8727955460e62.gif

EntityDto有泛型和非泛型兩種方式,泛型方式即?EntityDto<TKey>?會默認包含該泛型類型的ID,通常和實體中的ID做對應。如果我們不需要傳遞ID作為參數,則可以使用無泛型的方式作為DTO基類。

3ba6c1bc7ccc9b4b887fe45e0ef8e609.gif

和實體定義相似,ABP為DTO同樣定義了包含審計字段的EntityDto基類,?CreationAuditedEntityDto?包含記錄對象添加時間和添加人的信息,?AuditedEntityDto?包含最后修改時間和修改人,?FullAuditedEntityDto?包含增刪改的所有記錄。

2

應用服務

cb400227c1e639e0801c6edf82c1ec7e.gif

在ABP框架規范中,應用服務接口繼承自?IApplicationService?,存放于?Application.Contracts?項目中;其實現類繼承自?ApplicationService?存放于?Application?項目中。

b2d4d022a0540f114e2eddd5d522447b.gif

在?ApplicationService?基類中,ABP框架默認添加了一些屬性對象用于服務方法中調用,這里介紹幾個比較常用的屬性用途:

CurrentTenant/CurrentUser:

當前租戶/當前用戶,在應用服務中可以使用它們獲取當前調用者的租戶信息和用戶信息。

f7ec7e6f3d63db3e27c007cfc2e939fc.png

ObjectMapper:

用于配合AutoMapper實現對象映射。

e69458e709466b9334ab8190613fdcab.png

ServiceProvider:

在使用依賴注入時,除常規的構造方法注入、屬性注入等方式外,也可以使用ApplicationService中注入的ServiceProvider對象來獲取實例。

1aef1e9163401c6fcb2a7fcd8e290323.png

GuidGenerator:

ABP框架提供了一種有序GUID的生成方案,IGuidGenerator是這種方式的接口聲明,而在ApplicationService中,ABP默認注入了GuidGenerator對象用于服務內使用。

883961ec23dd35ac332e1f6ff71a0b49.png

UnitOfWorkManager:

用于工作單元處理,其中Current屬性代表當前的工作單元。

dd72a2b03d69fba1a04da715b9f44ebf.png

dd372acd22aecdac1d493d53e2eb92ad.gif

在ABP中,還提供了實現默認增刪改查方法的類?CrudAppService?,其接口定義為?ICrudAppService?。如果我們的應用服務需要實現增刪改查,可直接繼承自此類,其中主要包含以下方法:

CreateAsync:

用于添加數據并返回添加后的結果。使用動態WebApi時,該方法會被封裝成POST方式HTTP API接口。當實體使用Guid作為主鍵時,如果接口調用者傳入主鍵,則使用此主鍵,否則會使用GuidGenerator生成有序主鍵,如無特殊需求建議使用后者。

78a2290062329a08d859126789bab83d.png

UpdateAsync:

用于修改數據并返回修改后的結果,其方法包含兩個參數:id表示需要修改的數據的ID,input為需要修改的對象。使用動態WebApi時,該方法會被封裝成PUT方式HTTP API接口。

eeeb060ff7c3353cde80e298902fb292.png

DeleteAsync:

依據ID刪除數據。使用動態WebApi時,該方法會被封裝成DELETE方式HTTP API接口。

f4420c1f81e0908aa532e310df01e01d.png

GetAsync:

依據ID獲取單條數據。使用動態WebApi時,該方法會被封裝成GET方式HTTP API接口。

f4b7016c5e8ccbad8c88d2b728692034.png

GetListAsync:

用于獲取數據集合。使用動態WebApi時,該方法會被封裝成GET方式HTTP API接口。通常情況,我們可以使用?

PagedAndSortedResultRequestDto

?作為參數類型,可自動實現排序和分頁,如果我們不需要排序,也可以使用?

PagedResultRequestDto

?作為參數類型。如果我們希望添加數據過濾條件,可以重寫CrudAppService中的?

CreateFilteredQueryAsync

?方法。

b4605cf4d20aac65dd721f629d96324b.png

9a28189bd49ce6d7b4f8602cc2db2e01.gif

ABP中,應用服務默認使用AppService結尾,生成動態WebApi時,會自動去掉此后綴。

3f9107134463d93f441ade10501a6cce.png

注意:ABP生成動態WebAPI是依據應用服務的實現類,而如果使用動態客戶端代理,是依據應用服務的接口聲明。所以需要保證應用服務接口和實現的參數命名嚴格一致,否則使用動態客戶端代理時無法正確傳遞參數。

3

工作單元

c5ce0958f07687aabe45e825b66d940c.gif

工作單元是對應用程序中數據庫連接和事務范圍的抽象和控制。默認情況下,ABP每個應用服務方法都是一個工作單元,除基礎的工作單元控制外,我們也可以通過在調用倉儲增刪改方法時將autoSave參數設置為True來強制提交數據。

a800cf4c5337f9cf4f22a12e9aca5a9d.gif

除此之外,我們可以通過特性?[UnitOfWork]?控制工作單元的啟用和停用。

a397e474a90c9b824f65dfa5a7d5ec03.gif

在第2章中,我們提到了UnitOfWorkManager對象,在應用服務中,我們可以通過此對象獲取當前工作單元或者創建新的工作單元。

4

對象映射關系

2f89f94791e5110c35463f2e5894efb4.gif

除了DDD中定義的各種組件外,我們在ABP vNext框架下編寫應用服務時,還需要創建DTO和實體類之間的映射關系,作為AutoMapper框架對象映射的依據。

0bd6c6a775ae805ad92c13e164ce9e72.gif

此代碼位于Application項目中以【項目名+ApplicationAutoMapperProfile】命名的類中,在構造方法中,我們可以直接調用?CreateMap<TSource, TDestination>?方法創建TSource到TDestination類型的映射關系。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286459.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286459.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286459.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IE8采用IE7模式

< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> X-UA-Compatible是針對ie8新加的一個設置&#xff0c;對于ie8之外的瀏覽器是不識別的&#xff0c;這個區別與 content"IE7"在無論頁面是否包含<!DOCTYPE>指令&#…

【iVX 初級工程師培訓教程 10篇文拿證】01 了解 iVX 完成新年賀卡

目錄 【iVX 初級工程師培訓教程 10篇文拿證】01 了解 iVX 完成新年賀卡 【iVX 初級工程師培訓教程 10篇文拿證】02 數值綁定及自適應網站制作 【iVX 初級工程師培訓教程 10篇文拿證】03 事件及猜數字小游戲 【iVX 初級工程師培訓教程 10篇文拿證】04 畫布及我和 iVX 合照 【iV…

ArcGIS實驗教程——實驗二十六:ArcScene實現二維數據的三維顯示

ArcGIS實驗視頻教程合集:《ArcGIS實驗教程從入門到精通》(附配套實驗數據)》 DEM三維顯示: 地形數據+影像數據: 以上效果均是在ArcScene中實現的。 ArcScene允許用戶制作具有透明效果的場景,在場景中能對數據進行瀏覽和交互。ArcAcene支持復雜的3D符號系統及紋理制圖,支…

用Swashbuckle(swagger-ui)顯示API幫助并進行調試

安裝Swashbuckle&#xff1a; 打開NuGet控制臺輸入&#xff1a; Install-Package Swashbuckle 進行安裝。查看幫助 在瀏覽器輸入 http://調試項目地址/swagger/ui/index 可以看到幫助的效果API調試 點開調試的條目&#xff0c;填寫相關參數&#xff0c;“Try it out!”

Android之Fatal Exception: org.greenrobot.greendao.DaoException: Could not init DAOConfig

1 問題 release apk運行奔潰提示錯誤如下 Fatal Exception: org.greenrobot.greendao.DaoException: Could not init DAOConfigat org.greenrobot.greendao.h.a.<init>(DaoConfig.java:28)at org.greenrobot.greendao.b.a(AbstractDaoMaster.java:1) 2 解決辦法 progu…

Linux兩塊磁盤掛載指向一個文件夾LVM磁盤管理(一)

注意&#xff1a;任何磁盤的操作有可能損壞里面數據&#xff0c;請提前備份數據&#xff0c;切記&#xff01;切記&#xff01;切記&#xff01; 0x00&#xff1a;前言. 在Linux使用過程中&#xff0c;發現一個文件很大&#xff0c;比如5G&#xff0c;但是有兩塊物理磁盤一個剩…

AOL search

AOL: American On Line轉載于:https://www.cnblogs.com/sophia194910/p/5006466.html

盤點現有開源軟件許可合規工具

&#xff5c;原文出處&#xff1a;The Openchain Reference Tooling Work Group&#xff5c;翻譯&#xff1a;劉天棟.Ted&#xff0c;開源社.ONES&#xff08;開源戰略研究組&#xff09;&#xff5c;編輯&#xff1a;胡湘月&#xff5c;設計&#xff1a;周穎引言開源軟件已經吞…

centos 7.4 docker

centos 7.4 docker 1.查看系統版本 cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core)哈1 cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 哈1-02 cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) 哈1-22 cat /etc/redhat…

2016-08-29

已完成&#xff1a; 1. 監督PHP后臺完成學校部分接口 4. 評審添加孩子1 5. 評審安全上網 6. 評審答題器學生端 7. 認證方案初步 8. 安全網址方案初步&#xff1a;數據庫搜索模式 9. 評審學習窗1 10. 評審學習窗2 11. 評審添加孩子2 12. 答題器研發啟動會議 14. Log相關數據庫設…

【前端就業課 第一階段】HTML5 零基礎到實戰(十一)canvas 基礎

注意&#xff1a;手機&#xff08;APP&#xff09;打開&#xff0c;內容顯示更佳&#xff0c;不會的私聊博主即可 想要拿代碼或加入學習計劃&#xff08;** 博主會監督你并且教你寫文章 **&#xff09;的拉到最下面&#xff08;PC端Web打開&#xff09;加博主即可&#xff0c;目…

【遙感數字圖像處理教程】理論基礎知識目錄(5章全)

文章目錄1. 專欄簡介2. 專欄地址3. 專欄目錄1. 專欄簡介 遙感數字圖像的處理&#xff0c;是對遙感數字圖像的計算機處理。與工業和醫學數字圖像不同&#xff0c;遙感數字圖像類型更為多樣&#xff0c;內容更為復雜。因此&#xff0c;遙感數字圖像的處理&#xff0c;不僅需要掌握…

Android OkHttp3簡介和使用詳解

一 OKHttp簡介 OKHttp是一個處理網絡請求的開源項目&#xff0c;Android 當前最火熱網絡框架&#xff0c;由移動支付Square公司貢獻&#xff0c;用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient&#xff09;。 OKHttpGitHub地址 OKHttp優…

C語言試題一之計算并輸出n(包括n)以內能被5或9整除的所有自然數的倒數之和

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 請編寫函數…

MonoRail學習筆記十一:頁面控件的填充和驗證

Mono提供很多組件可以方便的處理頁面&#xff1a;可以自動將后臺的值填充到頁面&#xff0c;可以自動進行Javascript驗證&#xff0c;可以自動在后臺驗證等。這些功能都是比較實用的&#xff0c;可以減少很多開發 FormHelper是用來對應html頁面中Form內的tag的&#xff0c;可以…

JavaBean的詳細及引用

1.JavaBean實際是具有統一接口格式的java類 2.JavaBean的組成&#xff1a;屬性(Properties)、方法(Method)、事件(Events) 3.一個JavaBean的例子(該例子是用的Simple屬性<屬性在以后說>) //我遵循的習慣是類名大寫&#xff0c;包名小寫package com;//意思是將 FirstBean這…

驅動開發實戰之TcpClient

場景模擬假設你有一批非標設備需要對接&#xff0c;你需要根據設備方提供的協議&#xff0c;為IoTGateway開發驅動&#xff0c;進行數據交互。文章比較長也可以到官網會有更好的體驗&#xff0c;地址:http://iotgateway.net/docs/iotgateway/driver/tcpclient請先瀏覽上一篇驅動…

php讀取acc

<?PHP/*創建ADO連接*/$conn new COM("ADODB.Connection") or die ("ADO Connection faild.");$connstr "DRIVER{Microsoft Access Driver (*.mdb)}; DBQ" . realpath("DATUM/cnbt.mdb");$conn->Open($connstr);/*創建記錄集查…

【遙感數字圖像處理實驗】Erdas版詳細圖文實驗教程(8實驗全)

文章目錄1. 專欄簡介2. 專欄地址3. 專欄目錄1. 專欄簡介 遙感數字圖像的處理&#xff0c;是對遙感數字圖像的計算機處理。與工業和醫學數字圖像不同&#xff0c;遙感數字圖像類型更為多樣&#xff0c;內容更為復雜。因此&#xff0c;遙感數字圖像的處理&#xff0c;不僅需要掌握…

WEBAPI 增加身份驗證 (OAUTH 2.0方式)

1&#xff0c;在Webapi項目下添加如下引用&#xff1a;Microsoft.AspNet.WebApi.OwinOwinMicrosoft.Owin.Host.SystemWebMicrosoft.Owin.Security.OAuthMicrosoft.Owin.Security.CookiesMicrosoft.AspNet.Identity.OwinMicrosoft.Owin.Cors2&#xff0c; 在項目下新建Startup類…