我知道這可能是一個古老的問題,但什麼是更好的做法?在應用程序的所有層中使用域模型對象,甚至直接將值綁定到JSP上(我正在使用JSF)。或者將域模型對象轉換爲DAO或服務層中的DTO,並將輕量級DTO發送到表示層。視圖層中的DTO或域模型對象?
我被告知使用DTO是沒有意義的,因爲對數據庫的更改將導致所有DTO的更改,而到處使用模型對象只需要更改受影響的模型對象。但是,DTO的易用性和輕便性似乎超過了這一點。
我應該注意到我的應用程序使用Hibernate模型對象並使用自己的自定義創建的模型對象(意思是不綁定到任何數據庫會話,總是分離)。上述任何一種情況對於嚴格的模型對象模式都更有利?對於Lazy Initialization Exceptions這樣的事情來說,使用Hibernate是一個巨大的PITA。
我編輯的進一步討論,希望這個問題(不知道我這樣做是正確的):
我有一個模型對象的問題是,他們是不靈活的。下面的評論說應該設計應用程序,以便模型對象可以在所有層中使用。爲什麼?如果用戶想要一些荒謬的功能,我是否應該告訴他們,'這不適用於模型對象'?
簡單而簡單,有些時候模型對象不起作用。你可能有:
public class Teacher {
List<Student> students;
[tons of other Teacher-related fields]
}
public class Student {
double gpa;
[tons of other Student-related fields]
}
但也許你不需要所有的信息。你只需要老師的姓氏,他們今年教的學生人數,以及所有學生的平均GPA總和。在這種情況下你會做什麼?檢索完整的教師信息和學生關係,然後你的代碼在學生名單上計數,然後計算所有gpas的總平均數?這似乎比通過'String lastName','int numStudents'和'double combinedGpa'創建DTO更省力。
這可能聽起來像我的想法已經彌補了這些,但我還沒有在模型對象可以完全在每個實例中完全使用的應用程序中工作。普通的真實世界的應用程序不符合普通的用戶需求,但並不是那樣。
是的,我明白了。它看起來好像有時會增加不必要的複雜性。如果我有一個表示老師的對象,並且有時候我只需要頭信息(姓名,地址),我必須發送一個半人口填充的域對象到前端。它只是一種誤導,似乎不正確的我。 – sma 2010-04-21 13:43:27
@ smayers81 - 你爲什麼只在中途填充你的域對象?這聽起來像是一種不必要的優化(當然,如果你已經進行了配置或者發現了一個問題,那當然不會)這聽起來像你的問題的根源 - 對待你的域對象,如DTOs。爲什麼不把你的完全水合的域對象推到前端?如果你發現你有一個性能問題,那麼你有一個DTO的例子(或者完全繞過自定義對象,並直接處理你的框架提供的任何記錄集抽象)。 – 2010-04-28 16:41:54
因爲我總是覺得,如果沒有真正需要,通過網絡發送所有數據。我認爲這是Hibernate的懶惰理念背後的全部動力(我可能在那裏錯了) – sma 2010-04-30 00:32:29