2017-05-27 90 views
0

我有一些架构/模式问题。假设我有两个类的域模型。我使用Code First和Repository Pattern。 (让它在我只用领域,而不是属性的例子更简单)DTO中的聚合字段

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宠物字段是一个简单的列表。我使用Automapper将模型类转换为dto。 Dto接下来通过REST Api发送给客户端。现在,如果从某种角度来看,我需要为每个人展示它的名字,姓氏和PetCount(让我们假设有那么多的宠物,这会使它们从数据库中拉出来,并在视图中简单计数)。

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

回答

0

如果您有PetCount属性Person,那么你可以从Pet通过Owner属性达到它。因此,这个问题被简化为我们是否想要PersonPetCount属性。答案将是选择的结果。如果你问自己正确的问题,可以做出明智的选择:

  • 这个值多久使用一次?
  • 更新此号码需要多长时间?
  • 这个数字多久改变一次?

在一般情况下,如果你达到你需要一个PetCount的结论,那么你需要确保:

  1. 在插入Pet你更新其OwnerPetCount以及
  2. 在更新Pet你会确保它的老Owner的和新OwnerPetCount被更新,如果Owner改变
  3. 有关卸下PetOwner的PetCount更新
  4. 您使用事务,以确保一旦在上述状态下操作的任何类型的故障将被回滚到以前的状态

如果达到得出的结论是您不需要PetCount属性,您需要在每次需要时计算它。

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