Domain driven design 引用大型数据集/注入存储库的DDD?

Domain driven design 引用大型数据集/注入存储库的DDD?,domain-driven-design,repository-pattern,Domain Driven Design,Repository Pattern,我正在努力找到以下问题的最佳解决方案。我需要确定一个国家是否为“因努斯”(例如,当前由地址引用) 我在NHibernate中映射了以下简化模型: class Address { public Country Country {get; set;} } class Country { public List<Address> Addresses {get; set;} bool IsInUse() { return Addresses.Any(); }

我正在努力找到以下问题的最佳解决方案。我需要确定一个国家是否为“因努斯”(例如,当前由地址引用)

我在NHibernate中映射了以下简化模型:

class Address
{
  public Country Country {get; set;}
}

class Country
{
  public List<Address> Addresses {get; set;}

  bool IsInUse()
  {
    return Addresses.Any();
  }
}
类地址
{
公共国家{get;set;}
}
阶级国家
{
公共列表地址{get;set;}
bool-IsInUse()
{
返回地址。Any();
}
}
对国家/地区使用IsInUse方法效率低下,因为它会导致加载所有国家/地区(在内存中执行.Any()。此外,国家不需要真正了解地址,它只是为了使用IsInUse方法。因此,从消费者的角度来看,我喜欢上面的示例,它感觉域对象应该公开一个IsInUse方法,但它不会执行,并且包含不必要的关系

我能想到的其他选择是

  • 只需使用存储库并直接从服务层调用它。存储库可以封装一个调用,该调用只发出一个SELECT COUNT(*),而不是SELECT*,就像上面的lazy load选项一样。此选项将IsInUse逻辑完全保留在域层之外
  • 将一个存储库注入到IsInUse()中,该函数调用与上面相同的函数。我读到这是非常糟糕的DDD练习
  • 有人对这个问题有什么建议或更好的解决方案吗


    希望以上内容有意义。。。谢谢。

    我建议您不要每次执行查询时都计算它。将
    IsInUse
    反规范化。每次从某个国家/地区添加或删除地址时,您都可以确定该国家/地区是否正在使用并保存该值


    如何确定该值是另一回事,有各种各样的技术,从保存地址时立即确定到更新国家的
    IsInUse
    值,甚至在这些恰好是不同BC中的实体时使用消息传递。

    感觉就像是在编域概念来解决问题你的问题。你能告诉我们为什么你需要知道一个国家是否在使用吗

    存储库非常适合捕获语言和聚合持久性,而不是查询。你基本上是在问你的数据一个问题。也许把这个逻辑移到查询端?另见


    也许还有另一种方法可以跟踪所有使用中的国家。那些地址是从哪里来的?也许你可以引入域事件-当一个地址注册后,将该国家添加到正在使用的国家列表中,这样你就可以查询一个较小的列表。

    我会设计你的域实体,而不使用NHibernate或任何其他持久性机制的概念。如果这意味着通过使用NHibernate,您需要引入双向映射属性作为标准,那么我只会在存储库中使用您的NHibernate实体,并为您的域模型设计一组单独的实体,并在两者之间进行映射。从贵公司的角度来看,
    国家
    不应该知道
    地址
    ,这在我看来似乎是合理的

    将存储库注入域实体或使用延迟加载通常会违反DDD,并在序列化实体或它们丢失数据库上下文时导致问题


    您的
    IsInUse
    问题可以通过缓存查询(并非所有内容都必须存储在存储库中)来解决,或者您可以创建一个
    CountryStatistics
    类来处理这个问题?或者,您可以保留一个单独的持久化国家/地区列表,每当使用以前从未使用过的国家/地区创建新地址时,该列表都会更新。

    感谢您迄今为止的回复。原则上,我需要知道对象是否正在使用,以便确定是否可以编辑或删除它(country示例不是我的真实代码,我使用country是为了简单,但原则上假设country在使用时不能更改)。谢谢