Domain driven design 数据库和聚合根的存储库模式

Domain driven design 数据库和聚合根的存储库模式,domain-driven-design,repository-pattern,aggregateroot,Domain Driven Design,Repository Pattern,Aggregateroot,我试图理解“聚合根”的概念 让我困惑的一件事是,我不应该在不访问其聚合根的情况下直接访问子实体。例如,假设我有一个计算机实体和一个硬件实体 据我所知,我不应该直接访问硬件实体。我应该通过一个硬件实体的聚合根来访问它,它是一个计算机实体 class Controller_Test { public function loadHardware($computerRepository) { $computer = $computerRepository->fin

我试图理解“聚合根”的概念

让我困惑的一件事是,我不应该在不访问其聚合根的情况下直接访问子实体。例如,假设我有一个计算机实体和一个硬件实体

据我所知,我不应该直接访问硬件实体。我应该通过一个硬件实体的聚合根来访问它,它是一个计算机实体

class Controller_Test {

    public function loadHardware($computerRepository)
    {
        $computer = $computerRepository->find_by_id(1);
        $hardware = $computer->hardware; // lazy load
    }
}
假设我有一个使用存储库并查询计算机实体的控制器

class Controller_Test {

    public function loadHardware($computerRepository)
    {
        $computer = $computerRepository->find_by_id(1);
        $hardware = $computer->hardware; // lazy load
    }
}
如果我使用的是数据库,我将执行两个查询。一个用于计算机,另一个用于硬件


在我的存储库中使用“loadComputerWithHardware”来保存查询的数量难道没有意义吗?通过连接两个表来查询计算机和硬件是否违反了DDD规则?

控制器对硬件一无所知。它只知道电脑。存储库负责加载计算机所需的所有内容。如果您需要从控制器的角度对硬件进行引用,那么它可能本身就是一个聚合。

控制器对硬件一无所知。它只知道电脑。存储库负责加载计算机所需的所有内容。如果您需要从控制器的角度对硬件进行引用,那么它本身可能就是一个聚合。

没有人强迫您使用延迟加载,当您有复杂的实体图时,这样做是很常见的,但是如果更适合您,您可以使用渴望加载。请注意,即使使用延迟加载,也可以使其对域模型透明

让我困惑的一件事是,我不应该在不访问其聚合根的情况下直接访问子实体

这个想法是,聚合是其图中所有实体的唯一负责人,因此,在其图中执行的所有操作都应该经过聚合,甚至是对单个节点子实体的查询

在我的存储库中使用“loadComputerWithHardware”来保存查询的数量难道没有意义吗

好吧,这取决于你,但如果你不小心,你可能会把你的界面弄得乱七八糟。我会坚持使用loadComputer,让您的数据存储库的每个实现决定何时更好地进行快速加载或延迟加载

通过连接两个表来查询计算机和硬件是否违反了DDD规则


不,连接两个表不是一个领域概念,这是一个数据层问题,它们应该解耦。

没有人强迫您使用延迟加载,当您有复杂的实体图时,这样做很常见,但如果更适合您,您可以使用快速加载。请注意,即使使用延迟加载,也可以使其对域模型透明

让我困惑的一件事是,我不应该在不访问其聚合根的情况下直接访问子实体

这个想法是,聚合是其图中所有实体的唯一负责人,因此,在其图中执行的所有操作都应该经过聚合,甚至是对单个节点子实体的查询

在我的存储库中使用“loadComputerWithHardware”来保存查询的数量难道没有意义吗

好吧,这取决于你,但如果你不小心,你可能会把你的界面弄得乱七八糟。我会坚持使用loadComputer,让您的数据存储库的每个实现决定何时更好地进行快速加载或延迟加载

通过连接两个表来查询计算机和硬件是否违反了DDD规则


不,连接两个表不是一个领域概念,这是一个数据层问题,它们应该解耦。

如果我想用一个查询获得一台硬件计算机,该怎么办?我的问题是,使用“loadComputerWithHardware”或“findWithHardware”是否违反了规定?如果硬件是聚合的一部分,那么它应该由计算机的存储库检索。如果我想通过一个查询获得一台带有硬件的计算机,该怎么办?我的问题是,使用“loadComputerWithHardware”或“findWithHardware”是否违反了规定?如果硬件是聚合的一部分,那么它应该由计算机的存储库检索。