具有多个构造函数的单个DTO - 这似乎是一个合适的解决方案吗?

时间:2013-03-14 16:22:25

标签: c# .net web-services web-applications architecture

我有一个名为“Set”的实体,其中包含卡片。有时我想查看整张卡片及其内容(卡片视图),有时候我只想知道Set中有多少张卡片(表格视图)。在努力保持DRY的过程中,我决定尝试使用多个构造函数重用我的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 个答案:

答案 0 :(得分:0)

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

dto shold里面没有这样的逻辑。无论如何,我同意你的看法,复制是无用的(和邪恶的)。

答案 1 :(得分:0)

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

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

  if(isThin)
  {

  }  


   return objSet;
}

答案 2 :(得分: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并再次覆盖。

答案 3 :(得分:0)

通常的解决方案是让存储库(或等效的)通过具有不同访问方法(即Get() ... GetSet())来返回所需DTO /实体的“风味”,或者枚举您的“风味”有问题的实体并将其传递给您的“获取”(或等效)方法,即:

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

这可能会有点混乱,根据经验,有问题的实体应该有一些方法知道它是什么'味道',它闻起来很糟糕,因为它打破了封装和分离的关注 - 但在我看来它更好地抓住你的鼻子并保留一些带外数据,以便稍后您可以延迟加载实体,允许您将“淡味”转换为完全填充的实体。