Nano Hash - криптовалюты, майнинг, программирование

В чем разница между репозиторием и поисковиком в Seedstack?

Я использую Seedstack 16.7 и его бизнес-инфраструктуру с поддержкой плагинов JPA.

Есть 2 способа получить данные из источника данных.

  1. Репозитории http://seedstack.org/docs/business/manual/repositories/

    • They are pretty much the ones that acts in behalf of an traditional EntityManager on JPA, keeping the type safety.
  2. Поисковики http://seedstack.org/docs/business/manual/finders/

    • They retrieve Dto from a datasource.

Единственная очевидная разница между ними заключается в том, что finder является интерфейсом только для чтения к источнику данных.

Большинство запросов, которые требуются поисковику, можно выполнить, просто вызвав репозиторий и преобразовав из Aggregate в Dto.

Есть ли какая-то реальная разница между ними, или по их предназначению? кроме заявленного по этому вопросу.


  • Я не специалист по Seedstack, но точный ответ на этот вопрос, кажется, находится в самом первом абзаце страницы документации Finder, на которую вы ссылаетесь... На языке CQRS это похоже на ReadModelFacade. 16.09.2016
  • Честно говоря, документация была обновлена ​​совсем недавно, чтобы прояснить различие. 21.09.2016

Ответы:


1

Несколько сложно объяснить это в нескольких строках, потому что решение о моделировании исходит из глубокого понимания DDD, CQ(R)S, моделей быстрого чтения, согласованности в конечном итоге и т. д.

  • Искатели

Как говорится в руководстве: «Запросите слой сохранения или любой источник данных, чтобы получить объекты, специфичные для интерфейса приложения». Ключевое слово здесь — Интерфейс. В случае графического пользовательского интерфейса средства поиска используются для извлечения конкретного представления, чтобы представить его в настольной форме или на веб-странице. В приложении, отличном от CRUD, пользовательский интерфейс должен быть на основе задач, поэтому:

  1. Ваши представления не соответствуют вашим Сущностям и Агрегатам.
  2. Ваши Сущности и Агрегаты не содержат (не должны) полные списки данных выбора, т.е.: Штаты и Города (классические поля со списком каскадных зависимостей)
  3. Ваши агрегаты и сущности не содержат (не должны) полный список ссылочных сущностей (класс Customer с огромным списком заказов со всеми данными заказа, размещенными внутри, является неправильным совокупным моделированием DDD), но где-то в вашем приложении вы должны показать полный список заказов.
  4. Ваши Представления и Агрегаты могут быть получены из разных источников данных (обычно для производительности запросов и/или согласованности событий). то есть модели чтения NoSql, ненормализованная реляционная база данных или предварительно вычисленные представления (вместо таблиц, представляющих ваши объекты) в реляционной базе данных вашего домена.

Таким образом, у вас есть несоответствие импеданса между пользовательским интерфейсом и агрегатами/сущностями. Лучший способ решить эту проблему — явно создать способ перехода от сохранения к просмотру. Искатели вступают в игру.

  • Репозитории

Когда пользователь выдает команду, которая подразумевает изменение в вашем домене, вы должны получить агрегат и использовать совокупный корень в качестве точки входа для действия. Это обеспечивает согласованность и инварианты (правила) вашего домена. Агрегированное моделирование имеет много нюансов (посмотрите здесь), поэтому пытаться использовать агрегаты и сущности для ваших представлений. Поэтому вам нужен способ чтения и построения агрегатов памяти из источников данных. Это работа репозиториев. Иногда репозитории предоставляют вам дополнительные функции, которые вам не нужны при извлечении данных для представлений, такие как отслеживание изменений сущностей, создание уникальных идентификаторов для сохранения и т. д. Ничего из этого вам не нужно при работе с представлениями. Репозитории вступают в игру.

20.09.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..