RavenDB - Когда я хочу ссылку на другой корневой агрегат - PullRequest
3 голосов
/ 22 сентября 2011

Я давно пользуюсь DDD, так что меня устраивает идея агрегатов.Сначала у меня были проблемы с тем, чтобы не использовать / сохранять ссылки на другие корневые агрегаты, но я думаю, что я на борту ... так:

  • Хранение корневого агрегата как одного документа.... check
  • Использование денормализованных ссылок, содержащих свойства, которые не изменяются или изменяются редко .... check

Для случаев, когда я действительно хочу иметь полную ссылку на другуюЯ понимаю, что для корневого агрегата рекомендуется сохранять ссылку на его идентификатор и использовать клиентский API RavenDB Включает для эффективного извлечения всех объектов.

Это обрабатывает часть данных, чтоЯ не видел лучший способ справиться с этим в моем классе сущностей:

  1. Иметь свойства Product и ProductId в моем классе, используя [JsonIgnore] на Product , чтобы гарантировать, что он не будет сохранен с документом.
    • Полный граф объектов можно затем склеить обратно в хранилище (используя API Включает для эффективности) или я могу внедрить сервис в объект, который будет извлекать Product лениво (возможно N + 1 попадание)
  2. Склейте его вместе в ViewModel.Мне не нравится эта идея, поскольку я могу получить неожиданную ссылку NULL в домене, если не использовать ее правильно.
  3. Какой-то другой очевидный способ, которого я не вижу?

Мысли

Ответы [ 2 ]

2 голосов
/ 23 сентября 2011

В DDD есть как минимум две действительные точки зрения.Некоторые корневые агрегаты ссылок PPL только по идентификатору или другому действительному ключу, а второй использует специфичные для платформы ссылки на другие объекты.У обоих есть свои плюсы и минусы.

С такими решениями NoSql, как RavenDb, вероятно, лучше использовать первый подход, потому что второй просто технически неверен.

1 голос
/ 22 сентября 2011

Вы явно идете вразрез с рекомендованным дизайном, почему do вы хотите, чтобы свойство Product ссылалось на другой агрегат? Что это тебе дает?

...