DTO

时间:2017-05-27 08:51:09

标签: rest design-patterns ef-code-first automapper dto

我有一些架构/模式问题。假设我有一个包含两个类的域模型。我使用Code First和Repository Pattern。 (为了使示例中的更简单,我只使用字段,而不是属性)

public class Person {
    public int Id;
    public string Name;
    public string Surname;
    public virtual ICollection<Pet> Pets;
}
public class Pet {
    public string Name;
    public int BirthYear;
    public int OwnerId;
    public Person Owner;
}

我还有PersonDto和PetDto类,唯一不同的是,PersonDto中的Pets字段是一个简单的List。我使用Automapper将模型类转换为dto。 Dto接下来通过REST Api发送给客户端。现在,如果在某些视图中我需要为每个Person显示它的名称,姓氏和PetCount(假设有太多的宠物,它会使从数据库中提取它们并在视图中简单地计算它们非常低效)。

现在 - 介绍PetCount的正确方法是什么。我应该将此字段放在PersonDto以及Person类中,并阻止它在数据库中创建列(这对我来说似乎不对)。或许我应该只在PersonDto中创建PetCount字段 - 但是然后何时计算此值,在存储库方法中或者可能在映射时(后者对我来说似乎也不合适)。另一个问题是我是否应该在PetDto中创建一个额外的字段,或者我应该使用PersontWithPetCountDto继承PersonDto,或者我应该创建PersontWithPetCountDto类而不继承,但使用PetCount字段和PersonDto的所有字段

1 个答案:

答案 0 :(得分:0)

如果您的PetCount属性为Person,则可以通过Pet属性从Owner获取该属性。因此,问题可以归结为我们是否需要PetCount的{​​{1}}属性。答案将是选择的结果。如果你问自己正确的问题,可以明智地做出选择:

  • 这个值的使用频率是多少?
  • 更新此号码需要多长时间?
  • 这个数字多久变化一次?

一般情况下,如果您得出结论需要Person,那么您需要确保:

  1. 在插入PetCount时,您还会更新其Pet&#39; s Owner
  2. 在更新PetCount时,如果{{{},您将确保更新旧的Pet和新的Owner&#39; Owner 1}}已更改
  3. 删除PetCountOwner的PetCount已更新
  4. 您使用事务来确保在状态上方的操作中的任何类型的故障都将回滚到先前的状态
  5. 如果您得出的结论是您不需要Pet属性,则每次需要时都需要计算它。

    您也可以使用混合解决方案,涉及缓存系统。最佳选择取决于您。