Сервісний рівень проти DAO - чому обидва?


64

Я працював із SpringMVC, Hibernate та деякими базами даних на прикладі веб-додатків Java.

Є кілька різних, які роблять це, але цей весна 3 та підручник із інтеграції зі сплячим зі прикладом має клас моделі, вид (у jsp) та класи та сервіси та дао для контролера.

Моє запитання: чи не сервіс, а класи DAO не роблять те саме? Навіщо тобі вони обоє потрібні?

Це був підручник, який я фактично використовував: http://fruzenshtein.com/spring-mvc-security-mysql-hibernate/

Відповіді:


60

Як правило, DAO є максимально легким і існує виключно для забезпечення з'єднання з БД, іноді абстрагуванням, тому можуть використовуватися різні пакети БД.

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

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


1
Я погоджуюся з розділенням сервісних та дао-шарів та рівня обслуговування, що містить вашу логіку бізнесу.
Пітер Делані

не кажучи вже про те, що 1 служба може викликати декілька DAO, наприклад, зберігаючи користувача, ви можете поговорити з UserDao, UserOrdersDao тощо. Або ми повинні створити по одній службі для кожного? І тоді хто міг би зателефонувати всі ці служби?
Фермін Сільва

40

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

Також навесні безпека застосовується на рівні обслуговування в ідеалі. Ви б не хотіли змінювати цей спосіб.


5
Гей, дуже дякую за відповідь на моє запитання; ось присвята у вашому блозі! Дякую за прекрасний приклад, продовжуйте писати.
Джефф

Це якийсь час замислюється з моїм розумом, і я думаю, що досвід допомагає найбільше в цих ситуаціях. Дякую.
Utku Özdemir

Я погоджуюся з розділенням шарів сервісу та дао та вашого сервісного рівня, що містять вашу ділову логіку, і я б лише називав методи Дао. Як щодо того, коли одному із моїх методів обслуговування потрібно викликати інший метод обслуговування. Чи повинен я мати ще одну абстракцію над рівнем обслуговування, який викликає кілька методів обслуговування?
Пітер Делані

Ні. Класи на рівні обслуговування можуть мати посилання один на одного (за потреби), і вони можуть викликати потрібні методи.
lokesh

11

Адам Бієн вказує у своїй книзі на те, що JPA EntityManager є доброю універсальною реалізацією DAO:

http://realworldpatterns.com/

У світі Java EE майже ніколи не потрібно писати свій власний DAO, оскільки реалізація JPA включає його. Вам потрібно лише написати рівень обслуговування.

Реалізація власного шару DAO - це справді похмілля від дуже бідної архітектури J2EE 15 років тому, але багато людей все ще відчувають себе змушеними це робити. Ці користувацькі шари DAO часто пропонують не що інше, як функції переадресації, які викликають відповідний метод в EntityManager.

Отже, щоб відповісти на ваше запитання, так, вам потрібен рівень обслуговування та DAO, але вам потрібно лише написати сервісний рівень.


2
Я не впевнений, чи це стосується Весни - завжди є індивідуальний DAO, який потрібно зробити для Моделі. Можливо, ваше твердження "майже ніколи не потрібно писати власний DAO" стосується конкретно контейнерів / сервера додатків EJB?
Дон Чіддл

1
Краще написати свій власний (DAO / DAOImpl), хоча це буде лише карта EntityManager - Thats, оскільки в майбутньому ви можете додати ще одну реалізацію DAO без необхідності зміни коду службового рівня .
ahmednabil88

@YajliMaclo в чому різниця, що змінити?
Alex78191

4

Зазвичай я ввожу весь код (запити) db в DAO, обробку транзакцій та бізнес-логіку в сервісах. Це дозволяє сервісним методам викликати методи у кількох дао і зберігати все це в межах однієї транзакції. На мою думку, це дозволяє покращити повторне використання коду для дао.


2

Я виявив, що рівень обслуговування додає зайву складність у більшості випадків. Теоретично - уникати логіки бізнесу в шарі дао, але в кінцевому підсумку це просто призводить до плутанини, навіть деякі люди зловживають, щоб повністю видалити шар дао, оскільки вони вважають, що це не додає цінності. http://ayende.com/blog/4784/architecting-in-the-pit-of-doom-the-evils-of-the-repository-abstraction-layer

Але якщо у вас є декілька логік бізнесу, то так, це гарна ідея. Наскільки важливо зробити рівень обслуговування?


3
Я читав блог Ейенда вже кілька разів, і просто не можу похитнути почуття, що його дизайн (з яким я б погодився в один момент), хоча і вірний духу YAGNI, майже неминуче коштуватиме більше часу на розробку навіть у середньостроковий, ніж коштувало б в першу чергу встановити абстрагування шарів. Мені цікаво, чи він змінив свою думку про тісний зв'язок між всією програмою та NHibernate тепер, коли для однієї програми навіть частіше зустрічається запит на кілька джерел даних SQL, NoSQL та API.
Містер Кохез

@LennyGodber так, я знаю, що ви відчуваєте, що IMO краще мати шар DAO / сховища, оскільки він має більше переваг, ніж недоліки, тому що, як ви говорили, дуже часто є безліч джерел даних
Ісус

-1

IMHO Сервісний рівень може розглядатися як шар між контролером і шаром DAO. Цей сервісний шар саме там, де ми можемо додати ділову логіку і навіть створити об'єкт повернення, специфічний для того, що має бути надано представленням.

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