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

时间:2010-09-09 03:12:48

标签: domain-driven-design

我正在开发一个非常标准的电子商务网站,其中有产品和类别。每个产品都有一个关联的类别,这是一个简单的名称 - 值对对象,用于对产品进行分类(例如,项目1234可能有一个类别“气球”)。

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

但是,我遇到了一个用户需要能够搜索某个类别的问题。我怎么能在DDD中实现这个呢?我是DDD的新手,但我相信只有root聚合应该给它自己的存储库。所以这给了我两个选择:

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

    有人可以告诉我实施此方法的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

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

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

顺便说一句,我不熟悉,就像你一样。我是新手。

答案 1 :(得分:1)

放置一些东西你不知道在哪里投入人工服务通常会导致贫血的领域模型。

我会选择第一个选项。但是对没有root上下文的实体的需求表明你可能缺少另一个root。

答案 2 :(得分:0)

请勿尝试使用您的域模型实现所有内容。域模型对于更改系统状态非常有用,但查询不必要的复杂。所以将两者分开。它被称为命令查询责任隔离或CQRS。不,它与事件采购无关,即使它们确实可以很好地协同工作。

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