Чи правильно ми використовуємо шаблон сховища?


14

Ми використовуємо купу окремих класів з суфіксом, -repositoryщоб отримати дані з бази даних; для кожної таблиці своє сховище.

Наприклад, у нас є customerrepositoryклас, який має всі види методів пошуку клієнтів, і vacancyrepositoryякий має всілякі методи пошуку вакансій.

У мене є два питання щодо такого способу поведінки:

  1. Як щодо отримання даних, які охоплюють кілька таблиць? Наприклад, у мене є екран, на якому показані всі клієнти, які ще не створили вакансію. Чи можуть customerrepositoryвикористовувати методи з vacancyrespository, або обидва сховища повертають результати і чи є клас вище в ієрархії (назвемо це а dataservice), який отримує результати з обох сховищ та об'єднує їх у 1 результат?

  2. наскільки логіка може обробляти таке сховище?
    Я думаю, що нормально реалізовувати "де active == true" у сховищі, щоб отримати лише активні записи, чи навіть ця проста логіка повинна оброблятися класом вище в ієрархії (назвемо це a dataservice)?

Приклад, з яким я стикався зараз, такий:

У нас є список питань, який містить одне або більше запитань.
Питання може мати результат, який міститься в окремій таблиці.
Отже, коли ви хочете отримати загальний результат списку питань, вам доведеться поєднувати дані з questionlistтаблиці, таблиці запитань та questionstatusтаблиці.

Зараз у нас є 3 різних сховища для цих таблиць.

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

Або є questionlistdataserviceхто знає, які сховища використовувати?

І ще одне: наші сховища можуть призвести до IQueryableтого, що служба дзвінків може легко поєднувати результати, але як щодо того, коли це не так, я не думаю, що це гарна ідея отримати весь вміст усіх трьох таблиць з база даних.


1
Зазвичай у кількох доступів до таблиці домінуюча таблиця визначається таблицею запису, яка повинна існувати до отримання запиту. У лівому зовнішньому приєднанні це була б перша згадана таблиця, а в ПРАВИМУ ПРИЄДНУЮТЬСЯ, це була б друга.
Ніл

Відповіді:


15

Репозиторій повертає об’єкти домену і будується поверх шарів відображення. Для дуже простих об'єктів домену домену та таблиць баз даних можуть бути дуже однакові.

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

Приклад: у вашій базі даних є таблиці для особи та адреси. У вашому додатку адреса домену не є власною сутністю, це лише власність Особи. У цьому випадку у вас не було б PersonRepository та AddressRepository. Ви просто маєте PersonRepository. Домен не повинен стосуватися того, як зберігаються дані домену. Ці відповідальності знаходяться в шарі позаду сховища.

З вашого прикладу, здавалося б, ви насправді маєте DAO і тільки що назвали їх сховищами.


Отже, створюючи сховище, я можу також мати шлюз даних таблиці на один рівень глибше, і наші реплікатори - це фактично TDG.
Мішель

1
Можна, але зважити вартість та переваги. Не піддавайся знущанням зберігати DAO та сховища окремо за принципом кодового шару. Зробіть те, що в цьому випадку найчитаєше. Розділення та отриманий шар абстракції можуть бути корисними, якщо ваші сховища мають тенденцію робити багато рекомбінації даних у DAO.
Mihai Danila
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.