Определение, характеристики, типы и доступ к Услугам
Это сообщение изначально было размещено на https://petran.substack.com
Почти в каждом приложении корпоративного кода мы используем службы для добавления и поддержки бизнес- или других типов функций.
Но что такое Сервис 🤔❓❔
Как мы уверены, что спроектировали и внедрили четко определенные и хорошо структурированные сервисы 🤔❓❔
🌊Давайте рассмотрим основные аспекты Сервиса.
✒️ Определение
Служба — это операция, которая не может естественно вписаться в модель предметной области без инкапсуляции состояния
Простыми словами, Сервис поддерживает и расширяет функции модели предметной области без внутреннего состояния и с четко определенной ответственностью.
Например, у нас есть модель домена с именем Пользователь.
Модель пользовательского домена должна отправлять некоторые уведомления каждый раз, когда Пользователь создается или обновляется.
Мы можем легко понять, что эти уведомления не могут естественным образом вписаться в класс UserDomainModel.
Здесь может подойти служба. Мы создаем класс NotifyUserService, чтобы расширить UserDomainModel с помощью функций уведомлений.
NotifyUserService не требует инкапсуляции какого-либо состояния и несет четкую ответственность: отправлять все уведомления, необходимые UserDomainModel.
✏️ Характеристики
Сервисы — это не наборы кода, которые помогают нам внедрять новые или поддерживать старые функции.
Сервисы — не единственное место, где можно размещать функции
Службы должны иметь четкие характеристики, чтобы приносить ценность и способствовать более чистому дизайну кодовой базы:
- Не может естественным образом вписаться в модель предметной области, как описано выше. Службы расширяют и поддерживают классы модели предметной области.
- Четко определенная ответственность. Каждая служба должна иметь четкий и четко определенный контекст, который несет ответственность.
- Четко определенный интерфейс, клиенты должны легко использовать службу, и она должна быть многоразовой.
- Без сохранения состояния: любой клиент может использовать любой экземпляр конкретной Службы без необходимости настраивать внутреннее состояние Службы.
🦖 Типы
Службы в приложении с многоуровневой архитектурой можно разделить на 3 типа.
Приложение
Службы, которые поддерживают потребности приложения, его жизненный цикл и срок службы.
Примеры HttpRequestExtractService, AuthMiddlewareService, InvokeHttpControllerService, RouterService и т. д.
Домен
Услуги, реализующие все бизнес-требования
Инфраструктура
Услуги, не относящиеся к двум вышеуказанным типам.
Примеры Emailer, DatabaseCommunications, EventDispatcer, EventConsumers HttpRequestClient, IOReaderWriter и т. д.
🍃 Доступ к услугам
Создание и получение Служб должно быть простым и понятным для всех клиентских классов.
Все зрелые корпоративные платформы, такие как Spring Boot, NestJS, Laravel, Symfony и многие другие, имеют сложные механизмы, такие как Service Container, для легкого извлечения и управления. Услуги.
Если в нашем приложении нет контейнера службы, мы можем обернуть службу шаблоном Singleton и использовать шаблон Factory в качестве производитель для всех клиентских классов.
Рекомендации
- Дизайн, ориентированный на предметную область: решение сложных задач в основе программного обеспечения