Domain driven design 在域驱动设计中,实体可以拥有自己的存储库吗?

Domain driven design 在域驱动设计中,实体可以拥有自己的存储库吗?,domain-driven-design,Domain Driven Design,我在一个相当标准的电子商务网站上工作,那里有产品和类别。每个产品都有一个关联的类别,这是一个简单的名称-值对对象,用于对产品进行分类(例如,项目1234可能有一个类别“ballon”) 我将产品建模为根聚合,它拥有并知道如何修改它的类别,这是一个实体 然而,我遇到了一个问题,用户需要能够搜索一个类别。我应该如何在DDD中实现这一点?我是DDD新手,但我认为只有根聚合应该被赋予它自己的存储库。因此,我有两个选择: 将“SearchCategory”方法添加到ProductRepository 将搜

我在一个相当标准的电子商务网站上工作,那里有产品和类别。每个产品都有一个关联的类别,这是一个简单的名称-值对对象,用于对产品进行分类(例如,项目1234可能有一个类别“ballon”)

我将产品建模为根聚合,它拥有并知道如何修改它的类别,这是一个实体

然而,我遇到了一个问题,用户需要能够搜索一个类别。我应该如何在DDD中实现这一点?我是DDD新手,但我认为只有根聚合应该被赋予它自己的存储库。因此,我有两个选择:

  • 将“SearchCategory”方法添加到ProductRepository
  • 将搜索逻辑实现为服务(即CategoryFinderService)
  • 我个人认为选项2更符合逻辑,但有一个触及数据库的服务感觉很奇怪。不知何故,我觉得应该只允许存储库与数据库交互


    有人能告诉我什么是最好的方法来实现这一点吗

    IMHO,在您的域模型中,类别不应该是产品聚合的子级。产品有一个类别,但它不知道如何创建或编辑类别

    再举一个例子。想象一下ShoppingCart类,它是一个聚合根,包含项的列表。ShoppingCart负责添加/编辑/删除项目,在这种情况下,项目类不需要存储库


    顺便说一句,我和你一样是新手。

    把你不知道该放在哪里的东西放到人工服务中通常会导致领域模型贫血


    我同意第一种选择。但对没有根上下文的实体的需求表明您可能缺少另一个根。

    不要尝试用您的域模型实现所有内容。域模型对于改变系统的状态是强大的,但是对于查询来说不必要的复杂。所以把两者分开。这称为命令查询责任分离,或CQRS。不,这与事件来源无关,尽管它们确实很好地协同工作

    我实现了这样的场景,这样我就有了域对象和存储库(如果需要)的域逻辑端,这些对象和存储库在发生某些事情时(例如,下新订单或发货)会改变状态。但当我只需要在UI中显示一些东西时,例如按类别过滤的产品列表,这是一个简单的查询,根本不涉及域对象。它只返回根本不包含任何域逻辑的数据传输对象(DTO)