2010-07-10 60 views

回答

1

也許有點多餘的部件之間傳輸數據,但我已經輸入它如此嘿;)

爲了簡單化(很多),業務對象應該有getter/setter方法,DTO應該只有屬性。業務對象需要遵守業務規則,但DTO僅用於傳輸數據;他們不需要遵守任何規則,應該儘可能快地設計出數據。

在像PHP這樣的弱類型語言中,DTO並不總是必需的,因爲可以隨意爲通用對象提供任意屬性。儘管如此,它們仍然可以用於文檔,並且可以使用強類型的函數參數。

+0

感謝您的詳細回覆。我現在開始掌握一些東西=)謝謝。 – 2010-07-10 17:55:58

+0

在C#中,每個屬性本質上都是一個getter/setter對。在這方面,你的答案在C#領域沒有多大意義。 – Oded 2010-07-10 18:12:04

+0

@Oded:我認爲答案是有道理的。我相信他的觀點是業務對象應該控制DTO包含的數據。通過使用getter和setter方法而不是屬性,調用者更可能假設他們的數據正在被*處理*而不是簡單地被存儲。 – 2010-07-10 19:06:59

1

我只會說,唯一的區別是意圖,假設你的啞巴業務對象只持有狀態和沒有行爲。

在這種情況下:

  • DTO的旨在應用層
  • 啞業務對象是你的域模型
+0

其實我用DTO綁定了一個有30個字段的對象,但是我不能在我的DTO和BO本身之間找到任何區別的字段/屬性。在這種情況下,DTO是否被推薦,因爲我現在在項目中有冗餘? – 2010-07-10 17:40:52

+0

@Popo - 完全取決於你。什麼對您的應用程序有意義?你是否以相似的能力使用這兩個?他們有相同的責任嗎? DTO在那裏解耦? – Oded 2010-07-10 17:44:11

+0

嗯,好的。我現在正在使用它們來減少大型BO的內存浪費。還有一件事,如果你是我,你會用DTO來達到這個目的嗎? – 2010-07-10 17:49:39

2

當你說「愚蠢」的業務對象,你有效地使這些對象與DTO一樣。使業務對象成爲業務對象的是增加了驗證和其他功能邏輯。當他說業務對象需要setter和getter方法時,我不同意用戶「否」他們可以使用屬性就好,他們只需要比任何一個更多。

一個共同的觀點是業務對象應該被允許保存無效值,並且只有在試圖持久化數據庫時纔會拋出異常,在這種情況下屬性工作得很好。但是,大多數應用程序都希望在嘗試發佈到數據庫之前向用戶提供反饋。

羅克福德洛特卡的CSLA.NET方法是在業務對象上使用IsValid()方法,該方法具有一組已分配給對象本身的規則。還有其他方法可以解決這個問題,但關鍵是業務對象執行驗證。正如你懷疑的那樣,「愚蠢的」業務對象確實只是DTO。

相關問題