請先參考
項目架構規範:阿里規約,MVC架構以及三層架構(一)
https://blog.csdn.net/lin451791119/article/details/106348414
項目架構規範:阿里規約,MVC架構以及三層架構(二)
https://blog.csdn.net/lin451791119/article/details/106378277
項目架構規範:阿里規約,MVC架構以及三層架構(三)
https://blog.csdn.net/lin451791119/article/details/106396958
分層目錄要點
嚴格區分每層的職責
嚴格確定分層的調用鏈路
嚴禁使用map/json等格式做數據傳遞
嚴禁使用BeanUtil.Copy等方法轉換
分層目錄結構
總體分爲應用層、業務領域層和基礎設施層
應用層
應用層用於接收外部的請求,是整個系統所提供能力的外觀,包含API、MQ-Listener等。專用於處理和業務無關的操作,包含驗籤、參數校驗、攔截等處理,不實現業務邏輯通過編排業務領域和外部請求,對外提供細粒度的能力
- API:接收來自外部的HTTP請求,只做參數校驗、業務領域數據組裝、業務邏輯編排和響應請求
- MQ:監聽消息隊列的請求,不做業務處理
- Model:用於封裝外部的請求參數、封裝響應外部參數,與底層數據存儲的結構完全無關
- Assembler:用於Model與業務領域層的Model之間的相互轉換工作,例如:使用反射機制自動beanutils相互轉換
- Configuration:全局的配置信息或處理,例如:全局參數校驗機制、全局異常處理等
業務領域層
業務領域層主要用於實現業務邏輯,包含業務規則、策略和流程
- Model:用於接收或響應來自應用層的業務屬性,同時可承載Model的行爲避免失血模型。業務層只負責業務,與具體的表現形式無關,所以它返回的Model不應該出現與表現形式的耦合。
- Repository:倉儲層用於對持久化通用操作的封裝,將領域對象持久化,屏蔽了持久化層的特性
- Service:處理業務邏輯,對Repository和External的操作編排
- External:封裝對外部的請求,包含了請求的定義、參數等
基礎設施層
基礎設施層爲以上各層提供技術支持,例如持久化操作、公用的操作等
- Commons:共用的操作類、工具類等
- Persistence:直接面向DB的操作
命名規範
名稱 | 描述 | 所屬分層 | 示例 | 備註 |
---|---|---|---|---|
Client Request | 客戶端請求入參對象 | Facade.model | UserRequest | |
Client Response | 客戶端請求響應對象 | Facade.model | UserResponse | |
Domain Object | 領域對象 | Biz.domain | UserDomain | |
Value Object | 值對象 | Biz.domain | UserVO | |
Domain Factory | 領域工廠 | Biz.domain | UserFactory | 創建Domain Object |
Repository | 倉庫 | Biz.domain | UserRepository | 對Domain Object的持久化 |
Service | 業務邏輯 | Biz.service | UserService | 處理業務邏輯 |
External Request | 請求外部對象 | Biz.external.model | UserExtRequest | 請求外部接口的入參 |
External Response | 請求外部對象 | Biz.external.model | UserExtResponse | 接收外部接口的響應 |
Data Object | 數據庫對象 | Infrastructure.persistence.entity | User | |
Dao Object | 數據庫操作對象 | Infrastructure.persistence.mapper | UserMapper |
爲什麼要分出這個external這個包,是爲了以後向微服務架構轉型,尤其是Spring+Feign,會帶來極大的便利!如果請求遠程的服務和服務器提供的服務混雜在一起,整理項目的時候會十分混亂!
分層調用路徑
源 | 目標 | 所屬層操作 | 備註 |
---|---|---|---|
Client Request | Domain Object | Domain.factory | |
Domain Object | Data Object | Domain.Repository | 意味着Domain Object可以出現在Factory、Service和Repository層 |
Domain Object | Client Response | Facade.api | 拿到業務層的返回的Domain Object後,轉換成客戶端能識別的Client Response |