Я работаю с системой, в которой «вы не можете заставить контроллеры взаимодействовать с DAO!»философия дизайна была принята в определенный момент, и для каждого компонента был создан сервисный уровень.Большинство сервисов, как вы описываете, просто делегируют DAO.Я возражаю против этой философии по двум причинам.
Одна из них - это старое доброе "Вам оно не понадобится".Не реализовывайте что-либо, пока оно вам не понадобится.Просто потому, что вы предвидите какую-то причину иметь дополнительный уровень косвенности для выполнения некоторой дополнительной логики, она не уверена, что она вам понадобится.И когда вы в конечном итоге нуждаетесь в этом, вы, вероятно, обнаружите, что ваши ожидания не совсем соответствовали тому, во что вы верили ранее.И вы получаете дополнительную плату, потому что теперь вам нужно провести модульное тестирование двух классов вместо одного, и нередко вам нужно добавлять методы в двух местах вместо одного.
Во-вторых, какого чертаэто сервис в любом случае?Когда я моделирую свой домен, я стараюсь мыслить объектно-ориентированными терминами.Есть пользователи, поэтому класс User имеет смысл.Есть новости, поэтому класс NewsItem имеет смысл.Но я даже не знаю, что должен делать UserService.Содержать «бизнес-логику» для пользователей?Нет, для этого есть класс User.
Если вам нужно поддерживать строгий API для «внешнего мира», то я вижу случай, когда дополнительный слой остается неизменным.Но во всех остальных случаях вам это не понадобится.