如何跨同一实体的实例实现实体验证
How to implement entity validation across instances of the same entity
在我们的项目中,我们使用 DDD 作为架构(干净的架构)。
假设我有一个名为 A 的实体。A 有一个名为 B 的 属性。
现在我想要验证当创建第二个实体 A 时,B 在商店中的所有 A 实例中必须是唯一的。
我的想法是使用存储库为其实现域服务。那么问题是这个域服务是应该自己实现验证还是只为它提供数据......(在 interactor/usecase 中用于验证)。
示例代码(代码保持简单):
public class A
{
public A(string b)
{
B = b;
}
public string B {get; private set;}
}
Let's say I have an entity called A. A has a property called B. Now I want a validation that when a second entity A is created, that B must be unique over all instances of A in a store.
您尝试解决的问题有时称为 set validation。
简单的答案:你引入一个索引,它跟踪每个值 B 到允许拥有它的特定实体 A 的映射。
当然,这会引起争用;您需要缓解同时修改两个不同 A 的情况。索引和 A 的 all 成为需要管理的单个一致性边界的一部分。当我们将我们的实体存储在单个 RDBMS 中时,这几乎就是发生的事情——我们可以引入一个约束来确保没有重复项。
您可以将该单一一致性边界拆分为单独的 A 实体,以及单独的 B->A 实体。但是现在您可能会遇到同时修改两个不同的一致性边界的问题,这会引入竞争条件。
第三种可能性是放宽一致性约束——允许存储冲突,并在以后解决它们。例如,参见 warehouse systems and Udi Dahan on race conditions.
上的 Greg Young
domain-driven-design 通常的回答是坚决反对该要求,以确保它是真实的:如果违反约束,企业的实际成本是多少?
想想飞机座位图:很明显,一个座位上应该只坐一位乘客。但这并不意味着将座位 分配给 给多个人是一个严重的失败,因为人工操作员(登机口代理)有办法缓解这些问题。另见 Greg Young 的演讲 Stop Over Engineering。
我认为域服务是一个选择,看看这个博客(blog.sapiensworks.com/post/2017/08/23/…),其中给出了 'username must be unique' 场景,类似于我的最初的问题 post.
在我们的项目中,我们使用 DDD 作为架构(干净的架构)。 假设我有一个名为 A 的实体。A 有一个名为 B 的 属性。 现在我想要验证当创建第二个实体 A 时,B 在商店中的所有 A 实例中必须是唯一的。
我的想法是使用存储库为其实现域服务。那么问题是这个域服务是应该自己实现验证还是只为它提供数据......(在 interactor/usecase 中用于验证)。
示例代码(代码保持简单):
public class A
{
public A(string b)
{
B = b;
}
public string B {get; private set;}
}
Let's say I have an entity called A. A has a property called B. Now I want a validation that when a second entity A is created, that B must be unique over all instances of A in a store.
您尝试解决的问题有时称为 set validation。
简单的答案:你引入一个索引,它跟踪每个值 B 到允许拥有它的特定实体 A 的映射。
当然,这会引起争用;您需要缓解同时修改两个不同 A 的情况。索引和 A 的 all 成为需要管理的单个一致性边界的一部分。当我们将我们的实体存储在单个 RDBMS 中时,这几乎就是发生的事情——我们可以引入一个约束来确保没有重复项。
您可以将该单一一致性边界拆分为单独的 A 实体,以及单独的 B->A 实体。但是现在您可能会遇到同时修改两个不同的一致性边界的问题,这会引入竞争条件。
第三种可能性是放宽一致性约束——允许存储冲突,并在以后解决它们。例如,参见 warehouse systems and Udi Dahan on race conditions.
上的 Greg Youngdomain-driven-design 通常的回答是坚决反对该要求,以确保它是真实的:如果违反约束,企业的实际成本是多少?
想想飞机座位图:很明显,一个座位上应该只坐一位乘客。但这并不意味着将座位 分配给 给多个人是一个严重的失败,因为人工操作员(登机口代理)有办法缓解这些问题。另见 Greg Young 的演讲 Stop Over Engineering。
我认为域服务是一个选择,看看这个博客(blog.sapiensworks.com/post/2017/08/23/…),其中给出了 'username must be unique' 场景,类似于我的最初的问题 post.