2009-12-22 66 views
1

我們有一個包含數據和方法的實體(類)(讓我們稱它爲Person)。還有其他的類需要使用這個對象中的數據(讓我們稱其中一個Accountant),但是不需要使用它的方法中的功能。OO/DTO架構問題

將整個Person對象發送給Accountant還是創建一個新的PersonData對象來保存數據並將其發送給Accountant obj會更好嗎?

我們確實有一個案例需要弄清楚,但我想知道最好的一般答案,以便我們可以在整個過程中使用它。所以在web服務或在智能客戶端 - 例如

回答

4

通常,當您需要消耗一些序列化表單中的數據,你會伸手掀起了DTO。如果您只是在域中使用Person對象,並且已經正確封裝,爲什麼還要創建DTO?

1

我會說OOP會讓你使用person類中定義的'get'方法。 我不會發送整個對象作爲會計不需要整個對象,只是選擇性數據。 因爲您正在創建不必要的大量冗餘,所以我不會說後者。

但隨後OOP這樣是非常理想化的,因此它很可能是更好的做另一種方式......

1

我一般準備金使用的DTO數據的跨層傳輸。如果情況並非如此,我不確定是否有創造一個令人信服的理由。

0

我認爲這是一個信任界限的問題。在商業應用程序中,信任邊界通常會決定您的圖層體系結構。如果你的「會計師」在人的信任邊界之外,那麼應該有某種模型轉換。 架構和要求應該決定什麼樣的轉換。

2

由別人說,有一個在使用,除非沒有涉及轉移的DTO沒有真正的點... :)

的解決方案,我想建議,將抽象的傳遞給Accountant一個接口的對象IAccountee並有Person實現它......我不熟悉C#(從您的個人資料,我infered這是你的選擇:)語言),但這種可能應該指向你在正確的方向:

class Accountant { 
    //.... 
    public void performAction(IAccountee target) 
    { 

    } 
} 
interface IAccountee 
{ 
    string Name 
    { 
     get; 
    } 
    int Salary 
    { 
     get; 
     set; 
    } 
} 

class Person : IAccountee 
{ 
    //implementation here, as well as some stuff specific to Person 
} 

基本上,這是在SOLIDD :) ......這是靈活和乾淨,也避免共享不必要的信息從PersonAccountant ...

據我所知,C#接口不能要求變量(如在大多數語言中)/IDE功能生成默認的普通存取)如果你還沒有這樣做,但...這是一個有點耗費更多的時間比使用普通的變量,並且需要比一個普通字段訪問更多的性能,但OTOH,這也是我所想考慮好的做法,至少在事情沒有得到表現...我認爲這絕對不是創建一個額外的DTO類和複製數據來回(或至少在一個方向上)更優雅......

希望幫助... ;)

+0

爲什麼你會使用IAccountee:是它只是爲方便傳遞的變量或者是有什麼我失蹤? – silentcontributor 2009-12-22 21:14:14

+0

它會將個人會計從個人中分離出來,並將會計師本身不必要的所有內容都隱藏起來...... – back2dos 2009-12-22 21:44:55

+0

啊,夠公平的。謝謝。 – silentcontributor 2009-12-22 22:24:34