2012-10-25 94 views
1

我得到了一些服務,我返回的DTO, 現在我可以重複使用相同的DTO的不同方法。我應該創建多少個DTO?

讓我們說,我有以下接口:

List<ProductDTO> GetProductsByReseller(int reseller) 
List<ProductDTO> GetProductsByManufacturer(int Manufacturer) 
List<ProductDTO> GetProductsByCategory(int Category) 

使用相同的DTO的他們是絕對有效的,我認爲,因爲它們都具有真正相同的字段。

public class ProductDTO 
{ 
    public int Id { get; set; } 
    public string ProductName { get; set; } 
    public int Reseller { get; set; } 
    public int Manufacturer { get; set; } 
    public int Category { get; set; } 
} 

現在我有一些其它的方法,例如:

List<ProductDTO> GetProductsWithAdminInfoByCategory(int Category) 

對於該方法我必須將DTO與一些額外的字段擴展。

 #region only for admin 
    public int KnownDefects { get; set; } 
    public DateTime InStockSince { get; set; } 
    #endregion //only for admin 

可以重新使用現有的DTO並簡單地擴展它嗎? 或者我應該創建一個新的DTO,因爲某些字段永遠不會使用該方法?

我的想法是:如果只有1或2個字段是新的(從未在其他情況下使用),也許沒關係,因爲我不必創建重複的DTO,而維護2個DTO而不是1的交易是可以的。如果我從ProductDTO派生AdminProductDTO,可能會很好,但我不知道繼承對於DTO是否有效。

我錯了嗎? 從什麼時候開始創建新的DTO,什麼是一個好的閾值(幾個變化)?

更新: 如果我暴露了一個WCF服務,將暴露ProductDTO,它將有傳輸KnownDefectsInStockSince性能,如果他們沒有設置或爲空? 或者是WCF足夠聰明,不需要傳遞undefined/null屬性呢? (在這種情況下我也不會介意只有一個DTO與並不總是使用2個屬性。)

另一個更新: 恩,如果我繼承ProductAdminDTO從ProductDTO,我還可以調用具有以下服務它(只會接受ProductDTO)?

bool SaveProduct(ProductDTO) 

嗯,我想我可以簡單地嘗試了這一點我自己,以後會更新:)

+1

有很多解決方案。繼承,組合,Tuple 無論你認爲最適合你。做它 – DarthVader

+0

因此,如果繼承沒有問題,我會簡單地繼承DTO,然後我不必擔心如果我調用DoSomethingWithTheDTO方法。會很快更新我的問題。 – SwissCoder

+0

我剛剛從一個好人那得到了這些信息:「從wcf的角度來看,你的數據契約是消息結構定義,而不是內存中的對象,我想這可能是不可能的。」這就是我所擔心的! – SwissCoder

回答

2

嗯,看來你在經典傳承Vs的組合問題被卡住。

認爲是否ProductionWithAdminInfo 「ISA」 產品? 我不認爲它滿足ISA關係。額外的管理信息只是產品的另一個屬性。

所以組成在這裏似乎是不錯的選擇。 ProductWithAdminInfoDTO包含ProductDTO和AdminInfoDTo。

+0

所以你認爲繼承DTO是有效的,對吧?那麼我會很快更新我的問題,使我的一個更加明顯的tough。。我看到你的答案不是我想要的方向。 :) – SwissCoder

+0

如果有你想要的方向,就去做吧。使用你的直覺:) – DarthVader

+0

即使我仍然不確定,請將你的標記標記爲答案,我可以將InheritedDTO傳遞給具有ParentDTO服務合同的服務。 – SwissCoder