Методы репозитория для запроса дочерних элементов от совокупного корня - PullRequest
1 голос
/ 10 октября 2019

У меня есть Order агрегатный корневой класс, содержащий дочерние объекты-значения:

  class Order {
      val id: String
      val lines: Seq[OrderLine]
      val destination: Destination
      //...omit other fields
    }

Это модель чтения CQRS, представленная микросервисом order-search, отвечающим за поиск заказов по какому-либо фильтру.

Существует OrderApplicationService, который использует OrderRepository (я не уверен, что это чистый репозиторий в терминах DDD):

trait OrderRepository {      
  def search(filter:OrderFilter):Seq[Order]      
  def findById(orderId:String):Order      
}

и ElasticSearchOrderRepository, который использует ES в качестве поисковой системы.

В связи с новыми требованиями мне нужен новый метод API для пользовательского интерфейса, который будет выполнять поиск всех пунктов назначения по заказам с помощью некоторого фильтра. Это должна быть /destinations конечная точка, которая будет вызывать хранилище для поиска всех данных. В этом случае важна производительность, поэтому поиск всех заказов и сопоставление их с destination не кажется хорошим решением.

Какой наиболее подходящий вариант для решения этой проблемы? :

  1. Добавить новый метод в OrderRepository например, def searchOrderDestinations(filter:DestinationFilter): Seq[Destination]
  2. Создать новый репозиторий:
    trait OrderDestinationRepository {
      def searchOrderDestinations(filter:DestinationFilter): Seq[Destination]
    }

То же самое для службы приложений -мне нужно создать новый DestinationAppService?

Применимы ли эти опции? Или, может быть, есть лучшее решение? Заранее спасибо!

1 Ответ

1 голос
/ 10 октября 2019

Это модель чтения CQRS

Perfect - создайте и обновите список ваших заказов, проиндексированных по месту назначения, и используйте его для обслуживания результатов запроса.

Представьте себе «реляционную базу данных, которая включает в себя данные, необходимые для создания представления, и индекс». Запросы поступают в базу данных, которая действует как кэш для информации. Фоновый процесс (асинхронный) выполняется для обновления информации в базе данных.

Частота выполнения этого процесса будет зависеть от того, насколько устаревшими могут быть данные в представлении. Насколько это плохо для бизнеса, если представление показывает результаты по состоянию на 10 минут назад? на 1 минуту назад? час назад?

...