2013-06-16 3 views
6

0:Где поставить такую ​​логику бизнеса? Сервис против ДАО?

  1. Spring MVC - Hibernate.
  2. Контроллер -> Сервис -> DAO
  3. Теперь у меня есть метод, который извлекает что-то из БД и EVERYTIME, он делает это, должен сделать другой метод, сказать «processList» (что-то вроде изменения некоторых значений в списке в зависимости от на некоторых параметрах экрана).

Вопрос:

  1. Какой слой нужно поместить этот "PROCESSLIST"? (Контроллер, Сервис или DAO? И почему)

Мне действительно нужны некоторые разъяснения j2ee сейчас, я знаю, что MVC одинакова на разных языках, но я просто должен быть уверен :) Если я делаю это в .net Я бы, несомненно, поставил это на службу.

+1

Это действительно зависит от того, что метод 'processList' делает с логического представления. –

+1

Определенно ** нет ** в контроллере. Я бы поместил его в службу, но может быть огромная разница между тем, что вы (или сообщество java в целом) понимаете как услугу и какое мое восприятие обязанностей службы. –

+0

Я думаю, что этот вопрос попадает в * слишком общую категорию вопросов SO (т. Е. Это кандидат, который нужно закрыть). Тем не менее я добавил немного подробное описание того, какие правила я пытаюсь соблюдать, когда сталкиваюсь с решениями, например, «где этот фрагмент кода принадлежит». –

ответ

17

Это действительно зависит от того, что делает processList. Золотого правила нет. Некоторые правила, которые я пытаюсь выполнить, следующие:

  1. Никогда не делайте звонки между основными объектами на одном слое.
    • ManagementServiceImpl никогда не следует звонить NotificationServiceImpl.
  2. Не устанавливайте круговые зависимости между объектами.
    • Это очень похоже на приведенное выше.
  3. Если вы нашли себя повторять некоторую логику по нескольким основному объекту, попытайтесь перестроить код и распаковать его в специализированных логических классах (это улучшит блок-тестирование, а).
    • E.g. UserUpdateHandler или NotificationDispatcher (они до сих пор принадлежит уровню сервисов -> никто больше позволено называть их) ...
  4. Поместите код, где он логически принадлежит.
    • Не отвлекайтесь на тот факт, что какой-то класс должен что-то сделать. Возможно, это не место для кода.
  5. Никогда не пишите полностью обобщенный код, прежде чем понадобится.
    • Это имеет свой термин как преждевременное обобщение, что плохая практика похожа на преждевременной оптимизации. Сохранение нескольких строк кода теперь может привести к вытягиванию волос в будущем.
  6. Всегда пишите код, который может быть обобщен.
    • Это не противоречит предыдущему. Это говорит - всегда пишите с обобщением в виду, однако не беспокойтесь писать, если это не нужно. Думайте заранее, но не обязательно действуйте заранее.
  7. Оставить бизнес-логику для уровня обслуживания, логики сохранения данных на уровне данных и логики взаимодействия пользователя с уровнем представления.
    • Не пытайтесь разобрать пользовательский ввод в сервисном слое. Это не так, как подсчет конечной цены в приложении электронного магазина не относится к уровню представления.

Некоторые примеры processList:

  • Пример I - извлечение дополнительных отношений через Hibernate#initialize
    • Это то, что действительно между слоем обслуживания и DAO , В старых проектах у нас был специализированный класс FetchHandler (принадлежащий служебному слою). В новых проектах мы полностью отдаем это DAO.
  • Пример II - пройти через список и добавить деловому Validation сообщения в результате
    • сервисный слой, без сомнения
  • Пример III - пройти через список и подготовить UI-сообщения на основе ошибок при проверке
    • уровень презентации

Примечание стороны:

  • MVC это разные вещи из трехслойной архитектуры.
  • M модель охватывает все три слоя. Уровень презентации включает в себя как V просмотров, так и C контроллеры.
+0

На ваш первый вопрос, вы говорите, что служба никогда не должна звонить другой услуге? –

+0

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

+0

Я не уверен, что буду использовать слово «никогда». Например, Login/UserVerificationService. Возможно, вам придется вызвать это, прежде чем разрешить любую операцию CRUD в любой службе, в то время как в то же время у нее есть собственный связанный контроллер и просмотр отдельной страницы входа. То же самое относится к службе электронной почты. Я думаю, что эти вещи находятся за пределами вспомогательных или служебных классов и наиболее определенно необходимы для других служб. –

 Смежные вопросы

  • Нет связанных вопросов^_^