domain、entity和model的package的不同用法

鼓勵使用service domain dao 層分層設計概念。

其次,對幾層作用的理解:

 

第一:dao層操作單表,不涉及複雜邏輯,主要是表的增刪改查操作,完全根據domain的要求來查詢數據。

第二:domain層考慮業務邏輯,例如過濾條件,放行或者返回,以及數據的處理,爲調用dao層做好準備,一個domain可以調用一個或者一組相關的dao層

第三:service層調用一個或者一組domain層,主要是展現需要開放出去的接口,其中domain層不是所有的接口都要再service層體現的,可能僅在service層開放幾個接口出去,此外,主要接口需要對接受的參數要儘量的擴大化,也就是說可以容納各種類型的參數的接入(Object),然後需要在service層做好轉換,以備domain層使用。

 

正確的設計應該是,一個領域活動會聚合對應一個或一組DAO ,來完成一個領域活動。而一個服務可能包含兩個領域活動,比如一個轉賬的業務,對應兩個領域活動。兩個帳戶的金額分別發生變化,需要操作一組領域活動,而每個活動需要操作很多表(調用多個DAO )。

 

使用 接口方式可以實現系統之間的鬆耦合:

一般定義: IUserService  UserService  IUserDomain  UserDomain  IUserDao UserSqlDao   UserHbaseDao

使用接口可以有不同的實現類 ,不需要改代碼,可以通過配置更改不同的實現類


以前寫項目,都是先快速創建entity、dao、service再說,其他的包一般都是根據不同的框架來創建不同功能的包。比如用struts框架創建一個action包,用servlet就創建一個servlet包,用jersey框架就創建一個resource包。但是最近看了一個國外的開源項目源代碼,有一個包叫domain,打開一看裏面就是存的實體類,功能和我們平時用的entity是一樣的,那爲什麼要用domain而不用entity呢,那就涉及到這個包的具體用處了,雖然都是存的實體類,但是用途是不一樣的。

(1)、entity(實體)
entity的意思就是實體的意思,所以也是最常用到的,entity包中的類是必須和數據庫相對應的,比如說:數據庫有個user表,字段有long類型的id,string類型的姓名,那麼entity中的user類也必須是含有這兩個字段的,且類型必須一致。不能數據庫存的是long類型,user類裏的屬性是string類型。這樣做的好處是保持實體類和數據庫保持一致,另外,當用到hibernate或是mybatie框架來操作數據庫的時候,操作這個實體類就行,寫sql文之前不需要再做數據格式處理。

(2)、model(模型)
model大家不陌生,都知道是模型的意思,當用model當包名的時候,一般裏面存的是實體類的模型,一般是用來給前端用的。比如:前端頁面需要顯示一個user信息,user包含姓名,性別,居住地,這些信息存在數據庫的時候,姓名直接存姓名,但是性別和居住地一般會用數據字典的編號存到數據庫,比如:111代表男,222代表女,數據庫存的就是111或222,如果用entity的話,把111、222前端都不知道是什麼玩意,就算前端知道111代表男,222代表女,寫了一個js判斷數據處理。後來數據庫變動了,111代表女,222代表男,前端的js又需要重新寫,很顯然這樣不利於維護。所以就需要model來解決,後臺從數據庫取了數據轉化爲前端需要的數據直接傳給前端,前端就不需要對數據來處理,直接顯示就行了。還有一種情況,數據庫裏面的user表字段有十個,包含姓名,qq,生辰八字亂七八糟的等,但是前臺頁面只需要顯示姓名,如果把entity全部傳給前臺,無疑傳了很多沒用的數據。這時候model就很好的解決了這個問題,前臺需要什麼數據,model就包含什麼數據就行了
(3)、domain(域)
domain這個包國外很多項目經常用到,字面意思是域的意思。範圍有點廣了,比如一個商城的項目,商城主要的模塊就是用戶,訂單,商品三大模塊,那麼這三塊數據就可以叫做三個域,domain包裏就是存的就是這些數據,表面上這個包和entity和model包裏存的數據沒什麼區別,其實差別還是挺大的,特別是一些大型的項目。比如一個招聘網站的項目,最重要的對象就是簡歷了,那麼簡歷是怎麼存到數據庫的呢,不可能用一張表就能存的,因爲簡歷包含基本信息和工作經驗,項目經驗,學習經驗等。基本信息可以存在簡歷表,但是涉及到多條的就不行,因爲沒人知道有多少條工作經驗,項目經驗,所以必須要單獨建工作經驗表和項目經驗表關聯到簡歷基本信息表。但是前臺頁面是不關心這些的,前臺需要的數據就是一個簡歷所有信息,這時就可以用到domain來處理,domain裏面的類就是一個簡歷對象,包含了簡歷基本信息以及list的工作經驗,項目經驗等。這樣前端只需要獲取一個對象就行了,不需要同時即要獲取基本信息,還要從基本信息裏面獲取工作經驗關聯的簡歷編號,然後再去獲取對應的工作經驗了。
當然,如果用model的話也是可以達到domain的效果的。這個完全是看個人喜好和項目的整體架構,因爲創建不同的package的作用本來也就是想把項目分成不同的層,便於管理和維護。如果你樂意,你可以創建entity包,然後在裏面存圖片,創建images文件夾,裏面存js。你已經看懂就行,前提是如果是團隊開發的話能保證別人不打你。這個和語言一個道理,你在200面前和英國人說:private void set(int age),人家說:滾犢子;現在你這樣說,人家就知道是java語言了。能被人們通用的才叫語言,你說的別人聽不懂那隻能算是鳥語。所以開發的時候,建類建包的命名規則規範性還是很重要的。

那麼三句話總結下entity、model、domain的不同:
1.entity字段必須和數據庫字段一樣
2.前端需要什麼我們就給什麼
3.domain很少用,代表一個對象模塊


以上描述純屬個人觀點,如有錯誤,歡迎指正!
發佈了9 篇原創文章 · 獲贊 153 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章