返回總目錄《一步一步使用abp框架搭建正式專案系列教程》
今天談談《構建應用層服務》。
應用服務提供了一些門面樣式方法來分離表現層和領域層。這樣做的目的也是為了解耦,以後表現層就不用直接和業務邏輯層(核心層)打交道了,而是通過應用服務層(相當於媒介)來處理。應用服務層不僅定義了很多服務方法供表現層直接呼叫,而且還提供了一些dtos(data transfer object)。
第一,可以將它理解為乙個簡化的實體,更方便。比如,我們有乙個user表,裡面有id,name,password,isdeleted,creationtime等等。那麼我們簡化的userdto物件就只含有name和isdeleted兩個欄位就夠用了,因為表現層就只用到了這兩個字段。
第二,更安全,效能更好。如果不用dto而用實體類的話,最後生成的查詢就會將實體的所有欄位都會查詢出來。這樣一來就暴露了一些重要的資料給一些我們不想這些資料被看到的人。
第三,應用擴充套件性更好,耦合度降低。表現層是通過乙個dto物件作為引數來呼叫應用服務方法的,然後使用領域物件(實體類物件)執行特定的業務邏輯並返回乙個dto物件給表現層,所以,表現層完全獨立於領域層。在乙個理想的應用中,表現層和領域層不會直接打交道。
第四,序列化問題。當返回乙個資料物件到表現層時,很可能會在某個地方序列化。比如,在乙個返回json的mvc方法中,你的物件可能會被序列化成json傳送到客戶端。如果返回乙個實體的話會有問題的。比如,這個user實體有乙個role的應用,如果要序列化user的話也會序列化role。甚至role可能有list,permission又有乙個permissiongroup的引用等等…你敢想象序列化之後的物件嗎?亦可以輕易地一下子序列化整個資料庫。所以,在這種情況下返回乙個安全序列化的、特別設計的dtos是乙個好的做法。
先來定義dtos,看下面**:
namespace這個是輸入方向的dto,實現了iinputdto介面,這樣的話abp可以自動幫助我們進行資料校驗。當然,我們也可以新增資料註解進行校驗。校驗之後,還可以實現ishouldnormalize介面來設定預設值。public
string code
public
string provincecode
}public
class
getcityinput : iinputdto
public
string provincecode
}public
class
createcityinput : iinputdto, ishouldnormalize
[required]
public
string code
[required]
public
string provincecode
public datetime updatedtime
public
string updatedby
public
void
normalize()}}
}
namespace以上是輸出方向的dto。public
string name
public
string provincecode
}public
class
getcitiesoutput:ioutputdto}}
namespace以上定義的方法有同步和非同步兩個版本。}
接下來實現應用服務介面,這裡只實現乙個方法getcities(…),望讀者舉一反三。
publicclass
public
getcitiesoutput getcities(getcityinput input)
//根據省份編碼查詢城市資料
if (!string
.isnullorempty(input.provincecode))
return
null
; }
public
void
updatecity(cityinput input)
public
void
createcity(cityinput input)
//city = new city() ;
//_cityrepository.insert(city);
}
public taskgetcitiesasync(getcityinput input)
public
task updatecityasync(cityinput input)
public
task createcityasync(cityinput input)
}
應用層基本服務 筆記
1.唯一面向使用者的層 為使用者提供常用的服務 1 電子郵件 2 www 3 qq 還有很多 2.常用協議 1 超文字傳輸協議http 2 檔案傳輸協議ftp 3 簡單郵件傳輸協議smtp 4 網域名稱系統dns 5 遠端登入協議telnet 6 簡單網路管理協議snmp 7 多用途郵件擴充協議mi...
表示層 應用層
表示層 功能 為異種機通訊提供一種公共語言,以便能進行互操作。這種型別的服務之所以需要,是因為不同的計算機體系結構使用的資料表示法不同。例如,ibm主機使用ebcdic編碼,而大部分pc機使用的是ascii碼。在這種情況下,便需要表示層來完成這種轉換。應用層 包含了通常要使用的協議 http協議 超...
應用層協議
應用層協議定義了執行在不同端系統上的應用程式程序如何相互傳遞訊息。特別是定義了 交換的訊息型別,如請求訊息和響應訊息。各種訊息型別的語法,如訊息中的各個字段及其詳細描述。欄位的語義,即包含在字段中的資訊的含義。程序何時 如何傳送訊息及對訊息進行響應的規則。有些應用層協議是由rfc文件定義的,因此它們...