DTO的理解以及spring遇到的一個問題註解方式物件為空
阿新 • • 發佈:2019-02-07
之前不明白有些框架中為什麼要專門定義DTO來繫結表現層中的資料,為什麼不能直接用實體模型呢,有了DTO同時還要維護DTO與Model之間的對映關係,多麻煩。
然後看了這篇文章中的討論部分才恍然大悟。
摘兩個比較有意義的段落。
表現層與應用層之間是通過資料傳輸物件(DTO)進行互動的,資料傳輸物件是沒有行為的POCO物件,它 的目的只是為了對領域物件進行資料封裝,實現層與層之間的資料傳遞。為何不能直接將領域物件用於 資料傳遞?因為領域物件更注重領域,而DTO更注重資料。不僅如此,由於“富領域模型”的特點,這樣 做會直接將領域物件的行為暴露給表現層。
需要了解的是,資料傳輸物件DTO本身並不是業務物件。資料傳輸物件是根據UI的需求進行設計的,而不 是根據領域物件進行設計的。比如,Customer領域物件可能會包含一些諸如FirstName, LastName, Email, Address等資訊。但如果UI上不打算顯示Address的資訊,那麼CustomerDTO中也無需包含這個 Address的資料
晚上把程式中的所有的函式寫了下單元測試跑一下,總體把握下整個系統的執行流程
遇到問題是以前沒注意過,如果serviceimpl使用new的方法例項化而不使用註解方式,那麼在serviceimpl
中進行過註解的類是沒法例項化的,spring掃描註解的時候從頂層開始,依次往下,如果頂層使用
了new進行例項化,那麼類中使用註解的類物件也需要new例項化。
然後看了這篇文章中的討論部分才恍然大悟。
摘兩個比較有意義的段落。
表現層與應用層之間是通過資料傳輸物件(DTO)進行互動的,資料傳輸物件是沒有行為的POCO物件,它 的目的只是為了對領域物件進行資料封裝,實現層與層之間的資料傳遞。為何不能直接將領域物件用於 資料傳遞?因為領域物件更注重領域,而DTO更注重資料。不僅如此,由於“富領域模型”的特點,這樣 做會直接將領域物件的行為暴露給表現層。
需要了解的是,資料傳輸物件DTO本身並不是業務物件。資料傳輸物件是根據UI的需求進行設計的,而不 是根據領域物件進行設計的。比如,Customer領域物件可能會包含一些諸如FirstName, LastName, Email, Address等資訊。但如果UI上不打算顯示Address的資訊,那麼CustomerDTO中也無需包含這個 Address的資料
簡單來說Model面向業務,我們是通過業務來定義Model的。而DTO是面向介面UI,是通過UI的需求來定義的。通過DTO我們實現了表現層與Model之間的解耦,表現層不引用Model,如果開發過程中我們的模型改變了,而介面沒變,我們就只需要改Model而不需要去改表現層中的東西。
遇到問題是以前沒注意過,如果serviceimpl使用new的方法例項化而不使用註解方式,那麼在serviceimpl
中進行過註解的類是沒法例項化的,spring掃描註解的時候從頂層開始,依次往下,如果頂層使用
了new進行例項化,那麼類中使用註解的類物件也需要new例項化。