2015-04-29 2 views
0

Предположим, у нас есть слой выше уровня обслуживания, например, с веб-контроллерами. Сервисный уровень находится, в свою очередь, над слоем DAO/Repo. На верхнем уровне вызовы службы используются наряду с вызовами репо. В какой-то степени это ломает приложение, но мы должны действительно беспокоиться об обертывании методов репо, например findAll(), в методы обслуживания. Я так не думаю. Есть ли недостатки, которые могут вызвать большую боль из-за такого дизайна? Транзакционные вопросы?Смешивание DAO и служебных вызовов

ответ

3

Я бы обернулся и спросил: почему бы не использовать сервисный уровень для такого метода? Это такая боль, чтобы обернуть метод DAO, как:

public class PersonService { 
... 
    private PersonDao personDao; 
... 
    public List<Person> findAll() { 
     return personDao.findAll(); 
    } 
... 
} 

клиента данных Что делать, если вы не хотите, чтобы отправить обратно объект данных, представляющий человека к контроллеру? Вы можете сопоставить данные на уровне сервиса с объектом, на который зависят только клиенты.

Сцепление Вы также связываете свои слои. Уровень контроллера должен зависеть только от уровня обслуживания, а сервисный уровень должен зависеть только от уровня DAO.

Сделки Все транзакции должны обрабатываться на уровне обслуживания (поскольку метод услуги может вызывать несколько методов DAO).

Business Logic Вся бизнес-логика должна быть в вашем сервисном слое. Поэтому вы никогда не должны обходить такую ​​логику, зная DAO напрямую.

Я знаю, что для метода, такого как findAll, кажется бессмысленным, но я думаю, что точка в слое сцепления поражает этот аргумент.

+1

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

0

Да, может быть больно, если какой-либо разработчик использовал код кода DAO непосредственно из других слоев, то есть за исключением уровня сервиса или любой другой архитектуры, для которой вы следуете в качестве решения: Использование зависимостей maven создает 4-5 разных модулей для вашего проекта и укажите зависимости в pom.xml, чтобы никакие вызовы не выполнялись ни с каким другим неправильным слоем. Чтобы сделать это более понятным: - Если вы хотите получить доступ к слою 3 только со слоя 4, просто добавьте одну запись зависимостей в слой 3 для 4, и поскольку никакие другие модули не имеют доступа к слою 3, они не могут вызывать код из него.

Вы определенно получаете сотни примеров для этого.

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