我有一个名为“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 - 但这看起来很麻烦,也很难测试。上述解决方案是否正常,或者我是否打破了已知的最佳实践?谢谢你的时间!
答案 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);
这可能会有点混乱,根据经验,有问题的实体应该有一些方法知道它是什么'味道',它闻起来很糟糕,因为它打破了封装和分离的关注 - 但在我看来它更好地抓住你的鼻子并保留一些带外数据,以便稍后您可以延迟加载实体,允许您将“淡味”转换为完全填充的实体。