Aggregate Root Id - PullRequest
       74

Aggregate Root Id

0 голосов
/ 21 октября 2019

Я использую CQRS / Event Sourcing для проекта, и он в основном предназначен для изучения и открытия новых вещей.

И я немного запутался с агрегированными корневыми идентификаторами. Не о том, как они работают, а о том, как правильно их написать. Итак, позвольте мне объяснить:

Для каждого агрегатного корня у меня есть идентификатор, и этот идентификатор генерируется библиотекой ramsey / uuid . Я создал пользовательский объект Value с именем Uuid , который охватывает всю логику 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));
}

Моя задача сейчас, когда я создаю агрегированный корень, мне нужно, естественно, выбрать тип моего идентификатора, 2 варианта:

  1. Тип Uuid (объект значения выше)
  2. Новый объект значения (UserId, PropertyId и т. Д.), Который наследует объект значения Uuid.

На данный момент я используюпервое решение, но я думаю, что второе лучше в основном для Ubiquitous Language, UserID, PropertyId более значим, чем просто Uuid.

Кроме того, когда пользователь запрашивает ресурсы, полезно выставить uuid вURL, есть ли другой способ сделать это? Должен ли я создать другое поле в моем совокупном корне, своего рода идентификатор, который мы можем предоставить в URL для доступа к данному ресурсу?

Спасибо

1 Ответ

0 голосов
/ 21 октября 2019

Хороший вопрос Thibsss13. Об AGID (Aggregate Root Id) следует помнить несколько вещей.

Во-первых, они обычно являются деталями реализации. Практическая необходимость, и они не обязательно вписываются в UL. Но лучше, если они это сделают, но это должно исходить от бизнеса, а не от разработчика.

Относительно того, какой метод выбрать для генерации UUID. На мой взгляд, это не имеет значения. Просто идите просто и быстро - до тех пор, пока оно уникально!

Главный совет - Создайте AGID, прежде чем создавать экземпляр AG или создавать новый. Желательно как можно ближе к клиенту. Таким образом, вы знаете, на что обращать внимание при чтении.

Чтобы получить достаточный обзор того, как все это обычно сочетается, посмотрите Пошаговый обзор CQRS

...