如何从聚合中验证

How to validate from aggregate

我正在尝试了解使用事件源时 CQRS 模式命令端聚合实体的验证。

基本上我想知道处理验证的最佳实践是什么: 1.说码的唯一性。 2.永恒聚合id的correctness/validation

我的初步想法: 我考虑过构造函数传入服务,但这似乎是错误的,因为实体的 "Create" 应该是要分配的值。

我曾考虑过聚合外部的验证,但这似乎将逻辑置于我认为应该由聚合本身负责的地方。

谁能给我一些指导吗?

Uniqueness of say a code.

确保唯一性是set validation的一个具体例子。集合验证的问题在于,实际上,您通过锁定整个集合来执行检查。如果整个集合都包含在一个“聚合”中,那很容易做到。但是如果集合跨越聚合,那就有点乱了。

唯一性的常见解决方案是在数据库级别对其进行管理; RDBMS 非常擅长集合操作,并且可以有效地序列化。不幸的是,这将您锁定在具有良好集支持的数据库解决方案中——您无法轻松切换到文档数据库或事件存储。

另一种有时适用的方法是让单一聚合检查可用代码的缓存副本的唯一性。这让您可以更自由地选择您的存储解决方案,但它也带来了数据竞争引入您试图避免的重复的可能性。

在某些情况下,您可以将代码的唯一性编码到聚合的标识符中。实际上,每个标识符都变成一组。

记住 Greg Young 的问题

What is the business impact of having a failure?

知道一次失败的代价有多大可以告诉你很多关于你可以花多少钱来解决这个问题。

The correctness/validation of an eternal aggregate's id.

这通常分为两部分。更简单的方法是根据一些商定的模式验证数据。如果我们同意标识符将是 URI, then I can validate that the data I receive does satisfy that constraint. Similarly, if the identifier is supposed to be a string representation of a UUID, I can test that the data I receive matches the validation rules described in RFC 4122.

但是如果您需要检查标识符是否在其他地方使用?然后你将不得不问......在这种情况下的主要问题是你是否需要立即得到答案,或者你是否可以设法异步检查(例如,通过建模“未验证的标识符”和“验证标识符”。

当然,您将再次协调分布式计算中固有的所有竞争。

没有魔法。