dao层如何调用对象_你的项目应该如何正确分层?
你好,歡迎收聽極客視點。
說起應用分層,大部分人都會認為這不是很簡單嘛,就Controller、Service、Mapper三層。但在“簡單”背后,很多人并沒有將各層級的職責劃分清楚。比如在很多代碼中,Controller比Service還多,Service被當成透傳了,這是開發代碼容易被忽略的地方。這樣往往造成層級關系混亂,后續代碼無法復用、維護困難。
此前,公眾號“咖啡拿鐵(ID:close_3092860495)”介紹了優化代碼分層的方法,供你參考。
如何進行分層
一個好的應用分層需要具備以下幾點:
- 方便后續代碼進行維護擴展;
- 分層的效果需要讓整個團隊都接受;
- 各層的職責邊界清晰。
阿里巴巴的分層規范
在阿里的編碼規范中,對分層的要求如下:1. 開放接口層:可直接封裝 Service 方法暴露成 RPC 接口;通過 Web 封裝成 http 接口;進行網關安全控制、流量控制等。
2. 終端顯示層:各個端的模板渲染并執行顯示的層。當前主要是 velocity 渲染、JS 渲染、JSP 渲染、移動端展示等。
3. Web 層:主要是對訪問控制進行轉發,各類基本參數校驗,或者不復用的業務簡單處理等。
4. Service 層:相對具體的業務邏輯服務層。
5. Manager 層:通用業務處理層,它有如下特征:一是對第三方平臺封裝的層,預處理返回結果及轉化異常信息;二是對Service層通用能力的下沉,如緩存方案、中間件通用處理;三是與DAO層交互,對多個DAO的組合復用。
6 .DAO 層:數據訪問層,與底層 MySQL、Oracle、Hbase 進行數據交互。
阿里巴巴規約中的分層比較清晰,簡單明了,但是描述得還是過于簡單了,很多人還是分不清楚Service層和Manager層之間的關系,導致很多項目中根本沒有Manager層的存在。下面介紹具體業務中應該如何實現分層。
優化分層
首先需要說明的是,如果RPC框架選用Thrift,可能會比其他的RPC框架多出一層,作用和Controller層類似:
最上層的Controller和TService是阿里分層規范中的第一層:輕業務邏輯、參數校驗、異常兜底。通常這種接口可以輕易更換接口類型,所以業務邏輯必須要輕,甚至不做具體邏輯。其次是Service層,這是業務層,復用性較低,這里推薦每一個Controller方法都對應一個Service,不要把業務編排放在Controller中去做,否則以后你要接入Thrift,又需要把業務編排再做一次,這會導致你每接入一個入口層,代碼都得重新復制一份。如下圖所示:
這樣大量的重復工作必定會導致開發效率下降,所以你要把業務編排邏輯都放進Service層中。 然后是Mannager層,這是可復用邏輯層。這里的Mannager可以是單個服務,比如Cache、MQ等等;也可以是復合的,當你需要調用多個Mannager時,可以將它們合為一個Mannager,比如邏輯上的連表查詢等。如果是httpMannager或rpcMannager,還需要在這一層做一些數據轉換。再來看DAO層,這是數據庫訪問層。主要負責“操作數據庫的某張表,映射到某個Java對象”,DAO應該只允許自己的Service訪問。
最后順便聊一聊分層領域模型的轉換,在阿里巴巴編碼規約中,列舉了下面幾個領域模型規約:
- DO(Data Object):與數據庫表結構一一對應,通過DAO層向上傳輸數據源對象。
- DTO(Data Transfer Object):數據傳輸對象,Service或Manager向外傳輸的對象。
- BO(Business Object):業務對象,由Service層輸出的封裝業務邏輯的對象。
- AO(Application Object):應用對象,在Web層與Service層之間抽象的復用對象模型,極為貼近展示層,復用度不高。
- VO(View Object):顯示層對象,通常是Web向模板渲染引擎層傳輸的對象。
- Query:數據查詢對象,各層接收上層的查詢請求。注意超過2個參數的查詢封裝,禁止使用Map類來傳輸。
一個折中的方案是:
- 允許Service/Manager可以操作數據領域模型。
- Controller/TService層的領域模型不允許傳入DAO層,這樣就不符合職責劃分了。
- 同理,不允許DAO層的數據傳入到Controller/TService。
總結
業務分層對于代碼規范是比較重要的,決定后續代碼是否可復用,是否職責清晰、邊界清晰。
以上就是今天的內容,如果你的團隊有更好的分層方法,歡迎留言分享。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的dao层如何调用对象_你的项目应该如何正确分层?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python下载晚上excel_Pyth
- 下一篇: hhkb mac设置_把 HHKB 放在