도메인 기반 디자인에서 도메인 계층은 여러 가지 (전통적인) 서비스를 가질 수 있습니다. 예를 들어, 사용자 도메인의 경우 다음이있을 수 있습니다.
- 다른 방법으로 User 객체를 빌드하는 UserFactory
- 인프라 계층에서 지속성 서비스와의 상호 작용을 담당하는 UserRepository
도메인 계층의 UserService는 단순히이 두 서비스 및 인프라 계층에 대한 중재자 및 / 또는 외관입니까?
도메인 기반 디자인에서 도메인 계층은 여러 가지 (전통적인) 서비스를 가질 수 있습니다. 예를 들어, 사용자 도메인의 경우 다음이있을 수 있습니다.
도메인 계층의 UserService는 단순히이 두 서비스 및 인프라 계층에 대한 중재자 및 / 또는 외관입니까?
답변:
Domain services
그들이 아닌 것에 의해 가장 잘 설명됩니다 :
Entities
아니다Aggregate roots
Value objects
Entity
또는 하나에 맞지 않는 도메인 지식을 가지고 다니십시오. Value object
a의 예 Domain service
는 다음과 Saga/Process manager
같습니다. 여러 Aggregate roots
가지를 포함하는 장기 실행 프로세스를 조정합니다 Bounded contexts
.
존재가 말했다, 무엇을 하는 Domain service
과 방법 이 구현되는 것은 두 개의 직교 가지 있습니다.
도메인 계층의 UserService는 단순히이 두 서비스 및 인프라 계층에 대한 중재자 및 / 또는 외관입니까?
와 같은 일부 도메인 서비스 UserRepository
(에서 정의 된 인터페이스 Domain layer
와 구체적인 구현으로 구성 Infrastructure layer
) 는Facade
디자인 패턴을 사용하여 구현할 수 있습니다 . 다른 도메인 서비스는 그렇지 않습니다.
다른 레이어 (및 SOLID ) 에 의존해서는 안되는 중요한 규칙 외에는 구현 방법 에 대한 엄격한 규칙이 없습니다 .Domain layer
Dependency Inversion의 결과로 DDD의 서비스를 봅니다 .
"일반"종속성을 사용하는 경우 도메인 코드는 데이터베이스를 호출하여 엔터티 또는 팩토리를 생성하여 엔터티를 만드는 엔터티 또는 팩토리를 저장하거나 쿼리합니다.이 엔터티는 데이터베이스 또는 외부 서비스 또는 다른 종류의 인프라 코드와 연결되어 있습니다.
그러나 이것이 도메인 코드의 방식이 아닙니다. 도메인 코드는 인프라 코드에 의존해서는 안됩니다. 이러한 종속성으로 인해 테스트 및 재사용이 어려워집니다. 그렇기 때문에 그 의존성을 반전시킵니다. 인프라 코드를 도메인 코드에 의존하게합니다. 그렇게하려면 추상화를 도입해야합니다. 도메인 코드가 인프라에 의해 구현 될 것으로 예상되는 동작을 정의하는 추상화입니다.
그리고 DDD의 서비스는 그 추상화입니다. 대부분의 경우 도메인 코드의 경우 해당 서비스는 일반 인터페이스 여야합니다. 그리고 구현은 해당 인터페이스에 의존하는 인프라 코드에 있어야합니다.