0

我有一个名为“Set”的实体,其中包含卡片。有时我想查看整个卡片及其内容(卡片视图),而有时我只想知道集合中有多少张卡片(表格视图)。为了保持干燥,我决定尝试使用多个构造函数重新使用我的 SetDto 类,如下所示:

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 - 但这似乎很混乱且更难测试。上述解决方案看起来不错,还是我违反了已知的最佳实践?感谢您的时间!

4

4 回答 4

0

我将在 SetManager 类(处理 CRUD 操作的类)中创建三个方法,而不是在 DTO 中。

dto 里面没有这样的逻辑。无论如何,我同意你的观点,复制是无用的(而且是邪恶的)。

于 2013-03-14T16:25:21.603 回答
0

相反,我更喜欢通过在 Set 类中声明所有属性并通过传递所需参数来修改属性的扩展方法。否则,通过添加所需的属性和调用扩展方法来初始化 baseDTO 并具有各种版本以创建所需的版本 DTO 并返回 baseDTO。

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

  if(isThin)
  {

  }  


   return objSet;
}
于 2013-03-14T16:28:33.370 回答
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 创建一个新的 on 并再次覆盖。

于 2013-03-14T16:29:39.553 回答
0

一个常见的解决方案是让存储库(或等效的)返回您想要的 DTO/实体的“风格”,方法是使用不同的访问方法,即:Get() ... GetSet(),或者枚举相关实体的“风格”并传递它到您的“获取”(或等效)方法,即:

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

这可能会有点混乱,根据经验,相关实体应该有某种方式知道它是什么“味道”,因为它破坏了封装和关注点的分离,所以闻起来很糟糕 - 但在我看来,最好捏住你的鼻子并保留一些带外数据,以便稍后您可以延迟加载实体,从而将“轻口味”转变为完全填充的实体。

于 2013-03-14T16:41:36.340 回答