Лучший способ разработки сервисного слоя в Java

Я хочу разработать сервисный слой для своего приложения, используя java. В то же время сервисный уровень также может быть открыт для веб-сервиса.

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

Это хорошая идея сделать это? Помогите мне, пожалуйста


person Dilip    schedule 06.01.2012    source источник
comment
То, что вы делаете, называется «Фасад». Да Фасад - хорошая практика.   -  person Acn    schedule 06.01.2012


Ответы (2)


Трудно сказать с таким небольшим количеством деталей и даже не зная, что вы будете использовать для доступа к базе данных (JDBC? JPA? Hibernate?). Но

  • сервисный уровень и уровень сохраняемости — это не одно и то же. Чтобы облегчить развязку и тестируемость, я предпочитаю иметь чистый сервисный уровень и уровень доступа к данным.
  • наследование, как правило, не лучший способ повторного использования кода. Используйте хорошо продуманный API и предпочитайте делегирование наследованию.

Кроме того, не изобретайте велосипед. EJB3, Spring и другие фреймворки имеют хорошую поддержку для разработки сервисов и представления их как веб-сервисов.

person JB Nizet    schedule 06.01.2012
comment
Спасибо за быстрый ответ. - person Dilip; 06.01.2012
comment
Я использую hibernate и spring, согласно решению моей команды, они не хотят иметь отдельный сервисный уровень, напрямую использовать уровень DAO в контроллере и выполнять операции с БД. Для этого уровня DAO мы собираемся использовать шаблон Facade Design, как я сказал в своем вопросе. После этого мы собираемся представить каждый метод класса DAO как веб-сервис. Хорошо это делать? Помогите мне, пожалуйста. Заранее спасибо. - person Dilip; 08.01.2012
comment
Нет, это не очень хорошая идея. Атомарная транзакция обычно охватывает несколько вызовов DAO (например, дебетование учетной записи и кредитование другой). Таким образом, вам нужно всегда проходить через фасадный слой (или сервисный слой: это другое название того же самого), чтобы разграничить транзакции. - person JB Nizet; 08.01.2012
comment
Так что вы говорите, создать отдельный слой для веб-сервисов? - person Dilip; 08.01.2012
comment
Да, а также для сервисов, вызываемых с контроллера. Контроллеры не должны разграничивать транзакции. - person JB Nizet; 08.01.2012
comment
Большое спасибо за ваш добрый ответ. Я не понимаю, что вы имеете в виду под «Контроллеры не должны разграничивать транзакции». Не могли бы вы объяснить подробнее...? Вы говорите, что мы не можем использовать объект класса DAO непосредственно в контроллере? Если да, пожалуйста, объясните мне, почему .. Спасибо - person Dilip; 08.01.2012
comment
Потому что вам нужна транзакция для вызова DAO, и вам нужно включить несколько вызовов DAO в одну и ту же транзакцию (иначе вы можете, например, кредитовать учетную запись без дебетования другой). Итак, вам нужно запустить транзакцию, вызвать несколько DAO, затем зафиксировать транзакцию или откатить ее, если возникло исключение. Это не входит в обязанности уровня контроллера. Это ответственность сервисного уровня. Компоненты EJB и службы Spring позволяют определять службы, которые автоматически включаются в транзакцию. - person JB Nizet; 08.01.2012
comment
Спасибо еще раз. Насколько я понимаю из вашего слова, сервисный уровень будет вызываться контроллером, а сервисный уровень будет вызывать несколько DAO, в то же время сервисный уровень позаботится об управлении транзакциями. Пожалуйста, поправьте меня, если я ошибаюсь.... - person Dilip; 08.01.2012
comment
Ты понял. Это то, что я имел в виду. - person JB Nizet; 08.01.2012
comment
Большое спасибо за ваше руководство. - person Dilip; 09.01.2012
comment
+1 чистый сервисный уровень: я спросил, для чего используются EJB использовать-есть-ejbs. Ответ, который я принял, заключался в том, что их можно использовать для создания сервисного уровня. - person Raedwald; 10.03.2012

Вам следует подумать об использовании некоторых фреймворков, которые помогут вам с рутиной. Например. Spring или Java EE. Эти фреймворки могут предложить вам множество встроенных решений, таких как IoC, декларативные транзакции, декларативная безопасность и т. д.

person Artem    schedule 06.01.2012