【问题标题】:Multiple repositories for same data store but different domain logic?同一数据存储的多个存储库但不同的域逻辑?
【发布时间】:2020-05-20 10:10:25
【问题描述】:

我正在构建一个由给定表提供支持的功能,称为Urls,结构如下:

externalId| activatedId | url | userId

此表由 2 个场景(流)驱动:

  1. 每当用户在我的系统中创建帐户时,就会从 kafka 队列中使用一个事件来检索 user idurl。然后这些在相应的列上持久化Urls。 所以此时我们确实有 externalIdactivatedId 为空。

  2. externalIdactivatedId 在用户激活其帐户后的稍后阶段填充。这意味着userId 也将从表中删除,保持url 不变。

鉴于这是两个独立的流程,并且我正在尝试以域驱动方法来设计这两个流程,我正在考虑创建 2 个存储库,访问相同的 Urls 表:

  1. UserCreateRepository
  2. UserActivationRepository

然后每个存储库都会知道它自己的 URL 表示:

  1. UserCreateRepository 将使用UserCreationUrl
  2. UserActivationRepository 将使用 UserActivationUrl;

我想展开讨论以了解什么是最好的方法,因为我觉得只有一个存储库会混合两种流程,而且我们正在处理不同的场景实体。

【问题讨论】:

  • 也许解决方案之一是拥有 2 个不同的表来代表这 2 个实体,但它们也是相关的,所以这里有点分歧

标签: domain-driven-design software-design event-driven-design


【解决方案1】:

如果您想遵循领域驱动设计方法,您应该首先开始对领域进行建模。基础设施部分(数据库、存储库)稍后出现,因为它应该适应已经建模的域。 根据您的问题,您应该在此处找出聚合根。 根据 DDD 原则,一个聚合根应该只有一个存储库。 现在轮到你来识别聚合了。 我认为您的上述流程包含两个步骤:

  • 用户创建帐户:正在激活的 userId 和 Url 生成
  • 必须激活帐户

所以,我的建议是这样的(伪代码):

class User : AggregateRoot
{
   SetupAccount(userId, url) {...}
   Activate() {...}
}

这里好像有一个聚合,只有一个仓库适合...

【讨论】:

    猜你喜欢
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多