我正在考虑实施DDD。这里是示例:
我有2个域实体:Identity
和Pool
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()
(可能会抛出异常,池已存档)”。
我的问题是:
有人可以帮我解释一下吗?
注意:它们不在不同的机器(或微服务)中,它们使用的是相同的数据库。
答案 0 :(得分:0)
每当一个BC依赖于另一个BC的数据时,您可能最终都会遇到一致性的情况。
您可以将Pool
作为值对象存储在从属BC中,并根据例如从上游BC接收到的事件来更新其数据,也可以将Pool
数据存储为VO依赖对象本身。那将是对您的判断。由于您将在本地拥有相关数据,因此可以在本地进行检查。但是,它不能保证数据不是陈旧的。一旦数据更改为一致的,您将确保补偿所有不正确的更改。
需要使用域逻辑来执行不变式。我喜欢将强制执行这些不变式所需的任何数据传递给域。在您的情况下,集成/应用程序问题将检索当前池状态,并将其作为参数传递给domain方法。这样可以轻松进行测试。您可能会决定以与授权相同的方式将职责移出域,但这又是您的电话和YMMV。
即使如此,您也需要补偿不应执行的所有已执行命令。这同样适用于在线订购商品。您可能已将产品添加到购物车,但在结帐时该产品不再可用。