2013-03-14 56 views
0

我有一個名爲「Set」的實體,其中包含卡片。有時我想查看整個卡片及其內容(卡片視圖),有時我只想知道Set(表格視圖)中有多少張卡片。在我的努力讓事情變得乾燥,我決定嘗試並重新使用我SetDto類有多個構造是這樣的:帶有多個構造函數的單個DTO - 這看起來像是一個合適的解決方案嗎?

public class SetDto 
    { 
     public SetDto() 
     { 
      Cards = new List<CardDto>(); 
     } 

     // Called via SetDto(set, "thin") 
     public SetDto (Set set, string isThin) 
     { 
      var setDto = new SetDto() 
       { 
        SetId = set.SetId, 
        Title = set.Title, 
        Details = set.Details, 
        Stage = set.Stage, 
        CardCount = set.Cards.Count 
       }; 

      return setDto; 
     } 

     // Called via SetDto(set) 
     public SetDto(Set set) 
     { 
      SetId = set.SetId; 
      UserId = set.UserId; 
      Title = set.Title; 
      Details = set.Details; 
      FolderId = set.FolderId; 
      Stage = set.Stage; 
      IsArchived = set.IsArchived; 
      Cards = new List<CardDto>(); 
      foreach (Card card in set.Cards) 
      { 
       Cards.Add(new CardDto(card)); 
      } 

     } 

     /// property definitions 

我本來對套兩種不同的DTO - ThinSetDto和FullSetDto - 但這似乎是混亂和更難以測試。上述解決方案看起來不錯,還是我打破了已知的最佳做法?感謝您的時間!

+2

如果兩個不同的類似乎messey,如何傳遞一個字符串,而不用繞過一個構造函數到另一個感覺? – LukeHennerley 2013-03-14 16:26:16

+0

爲什麼不使用繼承? – MattW 2013-03-14 16:26:53

+0

根本不對......感謝下面的答案。完全不熟悉編程,這有助於很多。歡呼:) – RobVious 2013-03-14 16:40:48

回答

0

我會在不在DTO中的SetManager類(處理CRUD操作的類)中創建三個方法。

dto shold裏面沒有這樣的邏輯。無論如何,我同意你的觀點,複製是無用的(和邪惡的)。

0

相反,我更喜歡通過在Set類中聲明所有屬性並通過傳遞所需參數來修改屬性來實現擴展方法。否則,初始化baseDTO並通過添加所需的屬性和調用擴展方法來創建所需的版本DTO並返回baseDTO,從而具有各種版本。

public static Set SetDto(this Set set, bool isThin) 
{ 

    if(isThin) 
    { 

    } 


    return objSet; 
} 
0
public class BaseSetDTO 
{ 
    public BaseSetDTO() 
    { 
    Set(); 
    } 
    internal virtual void Set() 
    { 
    //Do your base set here with base properties 
    } 
} 
public class SetDTO : BaseSetDTO 
{ 
    internal override void Set() 
    { 
    //Do a full set here 
    } 
} 

創建一個基類,然後讓你的類型的處理,他們都應該設置什麼。爲您的ThinSetDTO創建一個新的並重新覆蓋。

+0

我在理解如何使用時遇到了一些麻煩。你能舉一個例子說明如何從控制器調用兩個版本嗎? – RobVious 2013-03-14 17:10:35

0

一個常見的解決方案是讓存儲庫(或等價物)通過具有不同訪問方法(即Get() ... GetSet())或者枚舉實體的「風味」來返回所需的DTO /實體的'風格'有問題,並傳遞給你的「獲取」(或同等學歷)方法,即:

enum ContactCollectionFlavors { Full, CountOnly, CountWithNames .... } 
... 
foo = ContactRepository.GetByLastName('Jones', ContactCollectionFlavors.CountWithNames); 

這可以變得有些混亂,從經驗中所涉及的實體應知道它是什麼「味」的一些方法,因爲它破壞了封裝和分離問題 - 但在我看來,它更好地控制了你的鼻子並保留了一些帶外數據,所以以後你可以延遲加載實體,讓你可以將「淡味」 '進入充分填充的實體。

相關問題