领域驱动设计,实体延迟加载

3
我是一个相对新手的领域驱动设计(DDD)学习者,但我理解的是,您需要与应用服务交互,这是您的“模型”入口。服务可以与存储库通信,存储库使用源(文件、数据库等)获取数据。存储库返回实体。
这就是我对它的整体理解。服务知道存储库但不知道实体等等。
现在我有以下问题。
我有一个名为user的实体,类似于以下内容(仅为示例)。
<?php    
class User
{
    protected $name;
    protected $city_id;

    public function getCity()
    {
         // return $city_entity;
    }
}

getCity()函数返回城市实体。我希望此函数使用延迟加载,因此在使用用户存储库时注入CityEntity并不是真正的延迟加载。

我提出了两个解决方案。但我觉得两者都违反了DDD原则。

我想到的第一个解决方案是将城市存储库注入到用户实体中,这有缺点:如果需要更多存储库,则必须在实体中加载所有存储库。它看起来像answer,但对我来说它只是存储库的包装器。那么为什么不直接注入存储库呢?

第二个解决方案是给实体一个服务定位器。这样做的缺点是,除非您阅读代码,否则您不再知道需要哪些存储库。

所以现在的问题是,如何在保持DDD原则的前提下提供延迟加载的灵活性?

1个回答

16

DDD的主要观点之一是,您的领域模型应该仅表达有界上下文的通用语言以处理业务规则。

因此,在DDD实体中,懒加载是一种反模式。这样做有一些原因:

  1. 如果一个聚合仅保存确保业务不变量所需的数据,那么它需要全部数据,而且数据很少,因此急切加载效果更好。
  2. 如果您懒加载数据,则客户端必须处理比那些在业务术语上相关的异常路径多得多的路径。
  3. 您可以使用共享标识符来处理聚合之间的引用。
  4. 为了项目目的而使用专用查询是便宜的(通常称为读模型)。

在我看来,你不应该将DDD实体用作数据访问技术:而应该使用DTO。

如果需要更多信息,可以查看Vaughn Vernon的Effective Aggregate Design


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接