Какие преимущества кроме переиспользования дает вынос бизнес-логики в сервисы?
Что проверяют
Понимаете ли вы, зачем нужен слой бизнес-логики, кроме «чтобы не копировать код». Обычно речь о выносе логики из контроллеров ASP.NET Core в классы-сервисы, а следом спрашивают про тестирование и про то, как не превратить сервис в свалку.
Как отвечать
Уточните, о каких сервисах речь: классы прикладного слоя внутри приложения или отдельные микросервисы. Чаще имеется в виду первое, и тогда плюсы такие:
- тестируемость:
OrderServiceс зависимостями через интерфейсы проверяется unit-тестом без веб-хоста, HTTP-контекста и базы, зависимости подменяются через Moq или NSubstitute; - независимость от транспорта: одну и ту же логику вызывают контроллер, gRPC-сервис, фоновая задача на
BackgroundServiceи консюмер очереди. Контроллер остаётся тонким: принял запрос, вызвал сервис, вернул ответ; - одно место для правил и транзакций: границы транзакции, проверка инвариантов и публикация событий описаны в одном месте, а не размазаны по экшенам;
- разделение ответственности: контроллер знает про HTTP (коды статуса,
ProblemDetails, привязку модели), сервис знает про предметную область. Правка API не трогает правила, и наоборот; - явные зависимости: сервис регистрируется в DI через
AddScoped, всё, что ему нужно, видно в конструкторе, и разросшийся конструктор сразу сигналит, что класс делает слишком много; - меньше конфликтов: изменения логики локализованы, команде проще работать параллельно и ревьюить.
Если имелись в виду отдельные сервисы как процессы, добавьте независимый деплой и масштабирование, но сразу назовите цену: сетевые вызовы, согласованность данных, наблюдаемость.
Где спотыкаются
Сразу уходят в микросервисы и рассказывают про масштабирование, хотя вопрос про слой внутри одного приложения.
Создают UserService на три тысячи строк со всеми операциями над пользователем. Это тот же толстый контроллер в другом файле, лучше делить по сценариям или переходить на обработчики команд.
Делают сервис пустой прослойкой, которая пробрасывает вызовы в репозиторий, а правила оставляют в контроллере. Файлов становится больше, а ни одного из перечисленных преимуществ нет.