我正在为项目使用CQRS / Event Sourcing,它主要用于学习和发现新事物。
而且我对聚合根ID有点困惑。不是关于它们如何工作,而是如何正确编写它们。所以让我解释一下:
对于每个聚合根,我都有一个ID,此ID由ramsey / uuid库生成。我创建了一个名为Uuid的自定义Value Object,它包装了uuid的所有逻辑。这是关于它的一些代码:
use Ramsey\Uuid\Uuid as BaseUuid;
/**
* @var StringValueObject
*/
private $value;
/**
* Uuid constructor.
*
* @param null|string $value
*
* @throws Exception
*/
protected function __construct(?string $value = null)
{
$uuid_str = BaseUuid::uuid4();
if (null !== $value) {
$pattern = '/' . BaseUuid::VALID_PATTERN . '/';
if (!\preg_match($pattern, $value)) {
throw new InvalidNativeArgumentException($value, array('Uuid string'));
}
$uuid_str = $value;
}
$this->value = StringValueObject::fromNative(\strval($uuid_str));
}
现在,我担心的是,当我创建聚合根时,我自然需要选择ID的类型,有2种选择:
目前,我使用第一种解决方案,但我认为第二种更好,主要是针对通用语言,UserID,PropertyId比Uuid更有意义。
而且,当用户请求资源时,在URL中公开uuid是一件好事,还有另一种方法吗?我是否应该在聚合根目录中创建另一个字段,一种可以在URL中公开以访问给定资源的ID?
谢谢
好问题,Thibssss13。关于AGID(汇总根ID),需要牢记一些注意事项。
首先,它们通常是实现细节。实际的必要性,它们不一定适合UL。但是,如果这样做的话,显然会更好,但它需要业务,而不是开发人员。
关于选择哪种方法来生成UUID。我认为这无关紧要。只要简单快捷即可-只要它是独一无二的!
最重要的提示-在实例化或新建AG之前创建AGID。最好尽可能靠近客户。这样,您就知道在阅读方面要注意什么。
有关它通常如何组合在一起的合理概述,请查看A CQRS Step-By-Step Overview