Що насправді повинен робити сховище?


15

Я чув багато шаблонів сховищ, але я зовсім не розумів, що насправді має робити сховище. Коли я кажу "що насправді має робити сховище", я в основному переймаюся питаннями, які методи він повинен надати. Наприклад, чи повинен репозиторій дійсно надавати методи CRUD, чи він повинен надавати якийсь інший метод?

Я маю на увазі, чи повинні сховища містити ділову логіку, або вони повинні просто містити логіку для спілкування зі сховищем даних та управління суттю, яке потрібно зберігати чи завантажувати?

Також я чув, що сховища є одиницями стійкості для агрегатів. Але як це? Я не розумію, як це працює на практиці. Я думав, що у нас повинен бути лише один інтерфейс, IRepositoryякий містить методи CRUD, і тоді для будь-якої сутності реалізація просто міститиме логіку для збереження та отримання такого типу з сховища даних.


4
"чи повинні сховища містити ділову логіку" - ні.
ozz

1
Ось моя відповідь на споріднене запитання щодо SO
Ерік Кінг

2
Я думаю , що ви попастися на слові «повинен» - сховище є шаблоном , конкретно, ви говорите , ніби є спосіб репо має бути зроблено , що це кращий спосіб зробити репо; це помилкова думка, оскільки існує лише один спосіб зробити репо, а все інше не було б репо. Як така, модель репо має сильні та слабкі сторони, але не існує декількох підходів до репо. Однак існує декілька способів взаємодії з даними, з яких репо - лише один. Прочитайте тут деякі інші підходи до взаємодії з передачею даних
Джиммі Хоффа

Відповіді:


13

Що ж, ви можете побачити хороший приклад у Spring Data Framework, який базується на концепції сховищ.

Там ви побачите, що сховища мають справу лише зі сховищем даних і рідко містять ділову логіку (це зарезервовано для сервісного рівня). Так, наприклад, ви подивіться на їх дизайн, побачите, що у них є інтерфейс CRUDRepository, який розкриває методи створення, знищення та відновлення об'єктів (серед іншого). Існує також PagingAndSortingRepository, який додає додаткову функціональність саме для цього, сортування та підкачки результатів тощо, тощо, тощо.

Отже, ця рамка, можливо, є гарним місцем для вивчення гарного дизайну сховищ.

Наскільки мені відомо, багато концепцій, впроваджених Spring Data Framework, походять з чудової книги під назвою Дизайн, керований доменом: Рішення складності в серці програмного забезпечення , книга має цілий розділ, присвячений дизайну репозиторію.

Ви можете розглянути можливість отримання його копії.

Невеликий уривок із книги пояснює:

Шаблон РЕПОЗИТОРІЇ - це проста концептуальна основа для інкапсуляції цих рішень та повернення фокусу нашої моделі.

РЕПОЗИТОРІЯ представляє всі об'єкти певного типу у вигляді концептуального набору (як правило, емульованого). Він діє як колекція, за винятком більш детальної можливості запиту. Об'єкти відповідного типу додаються та видаляються, а техніка, що стоїть за РЕПОЗИТОРІєю, вставляє їх або видаляє їх із бази даних. Це визначення збирає злагоджений набір обов'язків щодо забезпечення доступу до коренів АГРЕГАТІВ від раннього життєвого циклу до кінця.

Клієнти запитують об'єкти з REPOSITORY, використовуючи методи запитів, які вибирають об'єкти на основі критеріїв, визначених клієнтом, як правило, значення певних атрибутів. РЕПОЗИТОРІЯ отримує запитуваний об'єкт, інкапсулюючи механізми запитів баз даних та відображення метаданих. РЕПОЗИТОРІЇ можуть реалізовувати різноманітні запити, які вибирають об'єкти за будь-якими критеріями, які вимагає клієнт. Вони також можуть повернути підсумкову інформацію, наприклад, підрахунок, скільки примірників відповідає деяким критеріям. Вони можуть навіть повернути підсумкові обчислення, такі як загальна сума для всіх об'єктів, що відповідають деякому чисельному атрибуту.

РЕПОЗИТОРІЯ знімає величезний тягар з клієнта, який тепер може поговорити з простим інтерфейсом, який розкриває намір, і запитати, що йому потрібно з точки зору моделі. Для підтримки всього цього потрібно багато складної технічної інфраструктури, але інтерфейс простий і концептуально підключений до доменної моделі.

Тому:

Для кожного типу об’єктів, які потребують глобального доступу, створіть об’єкт, який може створювати ілюзію колекції в пам'яті всіх об'єктів цього типу. Налаштуйте доступ через відомий глобальний інтерфейс.

Надайте способи додавання та видалення об’єктів, які будуть інкапсулювати фактичне вставлення або видалення даних у сховищі даних. Надайте методи, що вибирають об’єкти на основі деяких критеріїв і повертають повністю інстанційні об'єкти або колекції об'єктів, значення атрибутів яких відповідають критеріям, тим самим інкапсулюючи фактичну технологію зберігання та запитів. Надайте РЕПОЗИТОРІЇ лише для корінців AGGREGATE, які фактично потребують прямого доступу. Тримайте клієнта зосередженим на моделі, делегуючи всі об’єкти зберігання та доступ до REPOSITORIES.


4

Він не повинен надавати ні прямого інтерфейсу CRUD, ні ділової логіки. Він опосередковує бізнес-логіку та базу даних. Інтерфейс повинен бути з точки зору ділової логіки, але не виконувати саму ділову логіку, більше схожу на примітивну бізнес-логіку. Як приклад, наприклад, ви збиралися створити систему електронної пошти, у вас є користувачі та повідомлення. Ваш Репозиторій надаватиме основні операції з використанням CRUD для користувачів та повідомлень, але він також надаватиме відфільтровані перегляди таких повідомлень, як GetUsersNewMessages (користувач) або GetSearchedMessages (користувач, searchTerms).

Ідея полягає в тому, що Репозиторій приховує, як реалізується сховище, і забезпечує чистий інтерфейс, що дозволяє швидко отримувати гнучкий доступ до даних. Зберігайте операції на високому рівні того, що має відбуватися, а не як означає, що ви маєте більше гнучкості для їх здійснення будь-яким способом, найкращим для базового магазину підкладки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.