Подтвердить что ты не робот

Зачем использовать сервисный уровень?

Я посмотрел пример на http://solitarygeek.com/java/developing-a-simple-java-application-with-spring/comment-page-1#comment-1639

Я пытаюсь понять, почему сервисный уровень необходим в первую очередь в примере, который он предоставляет. Если вы его вытащили, то в своем клиенте вы могли бы просто сделать:

UserDao userDao = new UserDaoImpl();
Iterator users = userDao.getUsers();
while (…) {
…
}

Кажется, что сервисный уровень - это просто оболочка вокруг DAO. Может ли кто-нибудь дать мне случай, когда что-то может стать беспорядочным, если слой обслуживания был удален? Я просто не вижу смысла в том, чтобы начать использовать сервисный уровень.

4b9b3361

Ответ 1

Наличие сервисного уровня в качестве обертки вокруг DAO является общим анти-шаблоном. В примере, который вы даете, это, конечно, не очень полезно. Использование сервисного уровня означает, что вы получаете несколько преимуществ:

  • вы можете четко различать активность веб-типа, которую лучше всего выполнять в контроллере, и общую бизнес-логику, которая не связана с сетью. Вы можете проверить бизнес-логику, связанную с услугами, отдельно от логики контроллера.

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

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

  • вы можете использовать перехватчик postCommit, чтобы делать уведомления, такие как отправка электронных писем, чтобы он не загружал контроллер.

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

Ответ 2

Использование уровня сервиса является хорошо принятым шаблоном проектирования в сообществе java. Да, вы могли бы сразу использовать реализацию dao, но что, если вы хотите применить некоторые бизнес-правила.

Скажем, вы хотите выполнить некоторые проверки, прежде чем позволить пользователю войти в систему. Где бы вы поместили эти логики? Кроме того, сервисный уровень является местом демаркации транзакций.

В целом хорошо держать ваш слой dao чистым и худым. Предлагаю вам прочитать статью "Dont repeat the DAO" . Если вы будете следовать принципам в этой статье, вы не будете писать какую-либо реализацию для своих даос.

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

С уважением, Джеймс

Ответ 3

Взгляните на следующую статью:

http://www.martinfowler.com/bliki/AnemicDomainModel.html

Все зависит от того, где вы хотите поместить свою логику - в свои сервисы или объекты домена.

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

Однако в большинстве случаев вам нужна простая архитектура, поэтому пропустите уровень сервиса и посмотрите на подход к модели домена. Проект, созданный на основе домена Эриком Эвансом и статьей InfoQ, раскрывается на этом:

http://www.infoq.com/articles/ddd-in-practice