2013-03-14 24 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); 

这可以变得有些混乱,从经验中所涉及的实体应知道它是什么“味”的一些方法,因为它破坏了封装和分离问题 - 但在我看来,它更好地控制了你的鼻子并保留了一些带外数据,所以以后你可以延迟加载实体,让你可以将“淡味” '进入充分填充的实体。

相关问题