RavenDB域模型

时间:2012-07-06 18:41:22

标签: domain-driven-design ravendb

我正在构建我的第一个小型RavenDB应用程序,我想知道在构建域模型时是否正确接近了。

我有一个国家列表,我想在我的模型中的多个地方使用。通常在过去我会创建一个数据库表来存储国家和一个看起来像这样的国家/地区对象:

public class Country{
    public int Id {get;set;}
    public string CountryName {get;set;}
}

当我去使用国家级时,我会在另一个对象中包含一个实例,例如:

public class Shop{
    public int Id {get;set;}
    public string Name {get;set;}
    public Country InCountry {get;set;}
}

或者

public class Customer{
    public int Id {get;set;}
    public string Surname {get;set;}
    public Country CountryOfResidence {get;set;}
}

依此类推。我是否正确地认为我现在应该做的是将国家/地区的ID存储在ShopCustomer类中,以便现在看起来像这样:

public class Shop{
    public int Id {get;set;}
    public string Name {get;set;}
    public int CountryId {get;set;}
}

public class Customer{
    public int Id {get;set;}
    public string Surname {get;set;}
    public int CountryOfResidenceId {get;set;}
}

当我从数据库中提取这些内容时,我可以使用Raven API的includes功能来获取相关的国家/地区对象,尽管它位于单独的对象中,但我不能做myCustomer.Country.Name。< / p>

显然这是一个非常人为的例子,但我真的只想检查一下,在继续沿着这条路走下去之前,我并没有完全错误地咆哮。

1 个答案:

答案 0 :(得分:3)

我还没有正确使用文档数据库,但我对你的问题的想法是:

  • 您不应该弯曲您的域模型以满足持久性实现的需要,但如果有机会让您的聚合设计完全持久无知,我会认为这是在使用文档数据库时
  • 如果国家/地区对象只包含名称,那么它很可能是Value Object,甚至不需要ID。值对象是不可变的,因此如果商店的国家/地区发生更改,您只需替换整个对象即可。不需要引用ID,因为多个聚合/实体引用相同的值并不重要。
  • 关于子实体:它们仅用于聚合范围内的目的,这意味着您不应在多个聚合中存在相同的实体。所以我想再次存储整个对象而不是对ID的引用。
  • 引用其他聚合是不同的。这是您要通过ID引用的位置。这个article解释了原因。