DDD依赖示例

时间:2020-08-04 14:22:27

标签: domain-driven-design

我正在考虑实施DDD。这里是示例:

我有2个域实体:IdentityPool

public class Identity
{
  public Guid Id { get; private set; }
  public string Name { get; private set; }
  public bool Active { get; private set;}
  public Guid PoolId { get; private set;}
  ....

  public static Identity Create(){...}

  public void Enable(){...}
  public void Disable(){...}
  public void UpdatePassword(){...}
  ...
}

public class Pool
{
  public Guid Id { get; private set; }
  public string Name { get; private set; }
  public bool Active { get; private set;}
  ....

  public static Pool Create(){...}

  public void Enable(){...}
  public void Disable(){...}
  public void Archive(){...}
  ...
}

问题是“我想添加验证/检查池是否已存档或已禁用,无法执行identity.Enable()identity.Disable()identity.UpdatePassword()(可能会抛出异常,池已存档)”。

我的问题是:

  1. 哪个层应处理此逻辑?域逻辑还是应用逻辑?
  2. 我应该如何实施?

有人可以帮我解释一下吗?

注意:它们不在不同的机器(或微服务)中,它们使用的是相同的数据库。

1 个答案:

答案 0 :(得分:0)

每当一个BC依赖于另一个BC的数据时,您可能最终都会遇到一致性的情况。

您可以将Pool作为值对象存储在从属BC中,并根据例如从上游BC接收到的事件来更新其数据,也可以将Pool数据存储为VO依赖对象本身。那将是对您的判断。由于您将在本地拥有相关数据,因此可以在本地进行检查。但是,它不能保证数据不是陈旧的。一旦数据更改为一致的,您将确保补偿所有不正确的更改。

需要使用域逻辑来执行不变式。我喜欢将强制执行这些不变式所需的任何数据传递给域。在您的情况下,集成/应用程序问题将检索当前池状态,并将其作为参数传递给domain方法。这样可以轻松进行测试。您可能会决定以与授权相同的方式将职责移出域,但这又是您的电话和YMMV。

即使如此,您也需要补偿不应执行的所有已执行命令。这同样适用于在线订购商品。您可能已将产品添加到购物车,但在结帐时该产品不再可用。

相关问题