我有一些架构/模式问题。假设我有一个包含两个类的域模型。我使用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的所有字段
答案 0 :(得分:0)
如果您的PetCount
属性为Person
,则可以通过Pet
属性从Owner
获取该属性。因此,问题可以归结为我们是否需要PetCount
的{{1}}属性。答案将是选择的结果。如果你问自己正确的问题,可以明智地做出选择:
一般情况下,如果您得出结论需要Person
,那么您需要确保:
PetCount
时,您还会更新其Pet
&#39; s Owner
PetCount
时,如果{{{},您将确保更新旧的Pet
和新的Owner
&#39; Owner
1}}已更改PetCount
其Owner
的PetCount已更新如果您得出的结论是您不需要Pet
属性,则每次需要时都需要计算它。
您也可以使用混合解决方案,涉及缓存系统。最佳选择取决于您。