Domain driven design 聚合根取决于用例,那么这是否意味着我们可能最终拥有大量的存储库?

Domain driven design 聚合根取决于用例,那么这是否意味着我们可能最终拥有大量的存储库?,domain-driven-design,Domain Driven Design,我听过很多关于聚合根取决于用例的说法。但在编码上下文中这意味着什么呢 您有一个服务类,它当然包含了一些方法(用例),这些方法将在存储库中完成一些事情。很好,所以您使用一个相当于聚合根的存储库来执行查询 现在您需要执行一些其他类型的操作,这些操作使用与第一个服务类完全不同的用例,但使用相同的实体 代表如下: 实体:客户、订单、行订单 服务1:添加新客户、删除一些客户、检索客户订单 在这里,聚合根似乎是客户,因为您需要这个存储库来执行这些用例 服务2:从实际订单中检索客户 这里的聚合根似乎是有序的,

我听过很多关于聚合根取决于用例的说法。但在编码上下文中这意味着什么呢

您有一个服务类,它当然包含了一些方法(用例),这些方法将在存储库中完成一些事情。很好,所以您使用一个相当于聚合根的存储库来执行查询

现在您需要执行一些其他类型的操作,这些操作使用与第一个服务类完全不同的用例,但使用相同的实体

代表如下:

实体:客户、订单、行订单

服务1:添加新客户、删除一些客户、检索客户订单

在这里,聚合根似乎是客户,因为您需要这个存储库来执行这些用例

服务2:从实际订单中检索客户

这里的聚合根似乎是有序的,因为您需要这个存储库来执行这个用例

如果我错了,请纠正我。这意味着你有两个根

现在我的问题是,由于聚合根取决于用例,这是否意味着如果您最终拥有大量用例,我们可能最终拥有大量的存储库?

上面的例子可能不是最好的例子。。。假设我们有一个日志,它包含日志,每个条目包含任务、问题和注释。(这是在告诉系统对项目做了什么的情况下)

这是不是意味着我最终会有两个存储库?(日记,日记) 在我需要从日志条目中添加新任务、问题和注释的用例中? (可以看作是一种服务)

或者可能最终得到4个存储库。(日记、任务、问题、笔记) 在我需要访问指令任务、问题和注释的用例中? (可以看作是另一种服务)

但这意味着如果我需要这两种服务(实际上包含用例),我实际上需要5个存储库才能在这两种服务中执行用例?


谢谢。

首先,您需要定义什么是聚合。我不知道用例集合。 我了解以下内容……
聚合是多个实体的联合。其中一个实体是聚合根,其余实体(或值类型)仅在选定的聚合根上下文中有意义
例如,如果不需要对订单行实体执行任何独立操作,则可以将订单和订单行定义为聚合。这意味着订单行仅在订单上下文中有意义。 为什么要定义聚合?需要减少对象之间的引用。这将简化您的域模型
当然,如果OrderLine是订单聚合的一部分,则不需要OrderLineRepository。
下面是一个包含更多信息的示例。你可以读埃里克·埃文斯的DDD书。他解释得很好。

嗨,我看到了你的帖子,我想我可以给你我的意见。首先,我必须说我已经在项目中做DDD三年了,所以我不是专家。但我目前在一个项目中工作,作为一名建筑师,在DDD中指导开发人员,我必须说,这不是在公园里散步。。。我不知道我重构了多少次模型和实体关系

但根据我的经验,您最终会得到一些存储库(数量不多但数量不多)。我的聚合通常包含几个类,聚合对象图并没有那么深(如果你知道我的意思的话)

但我尽量做到具体:

1) 聚合根由您的需求定义。我的意思是,如果您觉得需要通过Journal将Tasks对象经常更新,那么这可能是将其升级为聚合根的标志

2) 但一切都不能是聚合根,所以尝试封装紧密相关的对象。Notes似乎是根对象拥有的候选对象。您可能总是将注释与根关联起来,否则它就会失去上下文。音符不能单独存在

3) 请记住,聚合用于将大型复杂域拆分为较小的“岛”,以照顾其内部成员。重要的是不要让你的领域变得比现在更复杂

4) 在进入项目实施阶段之前,您不知道您的模型是什么样子的。如果您意识到某些存储库没有被频繁使用,那么它们可能是合并到其他根对象的候选对象(如果它们有这种关系的话)。您可以通过根对象分解出大量使用的对象,而无需其上下文。我的意思是,例如,如果日志是聚合根,并且包含注释和任务。一段时间后,您的模型会增长,可能会增加任务 与操作和操作历史以及用户、规则和权限有关联。现在,我在规则/操作/用户权限功能中抛出了一堆常见对象。这可能导致用例从另一个角度处理任务,“查看此用户执行的所有任务”等。任务更多地涉及某种状态/工作流引擎,因此可能成为聚合根本身

好的。这不是最好的例子,但它可能会给你一个想法。根对象可以包含子对象,其中的一些子对象也可以是根对象,因为我们在另一个上下文(而不是日志)中需要它。 但每次你用一个新的模式创业,我都会把头撞在墙上。只需遵循流程,让模型通过其客户机/订阅方自行发展。您可以通过使用模型来优化模型。服务(应用程序服务而不是域服务)当然是通过响应UI和用例(通常是一对一)的方法进行扩展的


我希望我在某种程度上帮助了你……或者没有:D

是的,你很可能最终拥有5个存储库(日志、日志、任务、问题、注释)。然后,您的服务将使用这些存储库为ea执行CRUD