Лучшая практика для шаблона DAO?

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

Я хочу спросить:

  • Предоставляет ли DAO-объект чисто связанную с доступом к данным задачу? Как насчет таких вещей, как инкапсуляция исключений?
  • Можно ли использовать другой шаблон для замены этого или лучше этого?
  • Я думаю, что модели домена pojo и скрипты транзакций осложняют даже простую проблему, возможно ли полностью удалить dao-слой?

Ответ 1

В идеале ваш слой DAO "абстрагирует" доступ к некоторой системе хранения данных (база данных, файловая система, каталог LDAP и т.д.). Таким образом, в этом смысле он используется только для задач, связанных с доступом к данным. Однако вы также можете иметь слой DAO, который обращается к веб-службе или другому компоненту, внешнему к вашему приложению. Это ключевой момент, он обеспечивает доступ к некоторому внешнему компоненту.

Основная идея заключается в том, что не существует деталей реализации вашего уровня DAO, которые выходят на более высокие уровни (изоляция). Хорошей отправной точкой для размышлений об этом является: что мне нужно сделать, если я планирую заменить компонент (например, базу данных), к которой предоставляет мой уровень DAO? Например, у вас есть некоторые данные внутри XML файлов, и вы планируете перенести данные в базу данных.

Предположим, что у вас есть все виды исключений, связанных с XML, которые выходят из вашего уровня DAO. Затем становится довольно сложно перенести ваш уровень XML на уровень базы данных. Однако, если вы инкапсулировали все детали реализации вашего уровня DAO, это станет намного проще.

В конце концов, это касается ремонтопригодности вашего кода. Чем меньше зависимостей, связанных с деталями реализации определенного уровня (службы, DAO,...), тем лучше ваш код поддержки.

Ответ 2

Основной целью такого слоя является обеспечение абстракции ПЕРСИСТЕНТНОСТИ обратного конца. однако, в большинстве случаев, из-за специфических особенностей стойкости, полное скрытие невозможно; Типичным примером является обработка запросов. Чтобы запросить БД, используя спящий режим, вы напишете какой-то код запроса (используя HQL, API запросов...) и совершенно другую парадигму при использовании JCR, BigTable или что-то еще. Как следствие, в большинстве случаев этот шаблон терпит неудачу.

Кроме того, существует еще более раздражающая проблема DAO/DTO. Затем вы продвигаетесь вперед, чтобы записать первый класс с вашими данными, а затем второй копировать данные с вашего первого без какого-либо добавленного значения только для изоляции слоя.

Однако есть некоторые работы, которые были сделаны в этой области. Для микроструктуры, которую я начал и реализовал для google-app-engine, я сделал небольшой список так называемого dao рамки, упрощающие этот довольно мирский код.

Обратите внимание, что в будущем я планирую обеспечить полную прозрачность с помощью определения сервиса gaedo, но это только надежда;-) (и, по-моему, не представляет для вас непосредственного интереса).

Ответ 3

Доступ к данным зависит от источника данных. Доступ к постоянному хранилищу, например к базе данных, сильно варьируется в зависимости от типа хранилища (реляционных баз данных, объектно-ориентированных баз данных, плоских файлов и т.д.) И реализации поставщика.

Использовать объект доступа к данным (DAO) для абстрактного и инкапсулировать весь доступ к источнику данных. DAO управляет соединением с источником данных для получения и хранения данных.

DAO реализует механизм доступа, необходимый для работы с источником данных. Источником данных может быть постоянное хранилище, такое как RDBMS, внешняя служба, такая как обмен B2B, репозиторий, такой как база данных LDAP, или бизнес-служба, доступная через CORBA Internet Inter-ORB Protocol (IIOP) или низкоуровневые сокеты. Бизнес-компонент, который опирается на DAO, использует более простой интерфейс, предоставляемый DAO для своих клиентов. DAO полностью скрывает детали реализации источника данных от своих клиентов. Поскольку интерфейс, открытый DAO клиентам, не изменяется при изменении исходной реализации источника данных, этот шаблон позволяет DAO адаптироваться к различным схемам хранения, не затрагивая его клиентов или бизнес-компоненты. По сути, DAO действует как адаптер между компонентом и источником данных.