Мартин Фаулер описывает шаблон уровня обслуживания своей великой книги Шаблоны архитектуры корпоративных приложений . Если вас интересуют вопросы, подобные тому, который вы задали, прочитайте эту книгу.
Мне приходит в голову одно использование: управление транзакциями базы данных . Некоторые люди пытаются инкапсулировать запуск и совершение транзакций в своих моделях домена. Но затем они запутываются, когда доменные модели вызывают другие доменные модели, которые также пытаются запустить и зафиксировать транзакции БД. Итак, какая модель действительно может решить, совершена ли транзакция или откатана? А что делать, если данная модель по-разному используется разными клиентами?
Сервисный уровень является решением для этого, потому что это уровень, на котором вы можете запускать и фиксировать работу, включающую несколько моделей домена.
Что касается того, насколько это распространено, я не думаю, что это вообще распространено. Большинство людей, использующих Zend Framework (или любую другую платформу PHP или Ruby), едва перешли от «Active Record решает все» к новому блестящему «Data Mapper решает все». Кажется, это сообщество изучает только один новый шаблон каждые пять лет. Некоторое время они не доберутся до уровня обслуживания.
Комментарий от @ktutnik:
Нет, шаблон уровня службы отличается от шаблона репозитория. Репозиторий предназначен для абстрагирования доступа к базе данных, поэтому вы можете использовать базу данных, например, коллекцию. Сервисный уровень - это инкапсуляция сложных операций приложения.
Еще один способ думать о них - это их связь с моделью предметной области. Репозиторий используется между моделью предметной области и базой данных. Принимая во внимание, что уровень обслуживания использует одну или несколько моделей домена.
Service Layer ---> Domain Model(s) ---> Repository ---> DBAL