В домене, управляемом дизайном, уровень домена может иметь несколько (традиционных) сервисов. Например, для пользовательского домена мы можем иметь:
- UserFactory, который строит объекты User различными способами.
- UserRepository, который отвечает за взаимодействие со службами постоянства на уровне инфраструктуры
Является ли UserService на уровне домена просто посредником и / или фасадом для этих двух служб и уровня инфраструктуры, или это еще не все?
Ответы:
Domain services
лучше всего описать, чем они не являются:Entities
ниAggregate roots
Value objects
Entity
или одномуValue object
Пример a
Domain service
: aSaga/Process manager
: он координирует длительный процесс, включающий несколькоAggregate roots
возможных из разныхBounded contexts
.При этом, что такое
Domain service
и как это реализовано - две ортогональные вещи.Некоторые доменные службы, такие как
UserRepository
(составленный из интерфейса, определенного вDomain layer
и конкретной реализации вInfrastructure layer
), могут быть реализованы с использованиемFacade
шаблона проектирования. Других доменных служб нет.Не существует жесткого правила о том, как их реализовать, кроме важного правила о том, что оно
Domain layer
не должно зависеть от других уровней (и SOLID ).источник
Я вижу услуги в DDD как результат инверсии зависимости .
Если бы вы использовали «простые» зависимости, тогда ваш код домена вызывал бы базу данных для сохранения или запроса сущности или фабрики, которая создает сущность, которая связана с базой данных или внешней службой или каким-либо другим кодом инфраструктуры.
Но это не то, каким должен быть код домена. Код домена не должен зависеть от кода инфраструктуры. Поскольку эта зависимость затрудняет тестирование и, возможно, повторное использование. Вот почему вы инвертируете эту зависимость. Вы делаете код инфраструктуры зависимым от кода домена. И для этого вам нужно ввести абстракцию. Абстракция, определяющая, какое поведение доменный код ожидает реализовать инфраструктурой.
А сервисы в DDD - это та абстракция. В большинстве случаев для кода домена эти сервисы должны быть простыми интерфейсами. И реализация должна быть в коде инфраструктуры, который зависит от этих интерфейсов.
источник