Определение, характеристики, типы и доступ к Услугам

Это сообщение изначально было размещено на 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 в качестве производитель для всех клиентских классов.

Рекомендации

  • Дизайн, ориентированный на предметную область: решение сложных задач в основе программного обеспечения