DDD에서 도메인 서비스는 본질적으로 단지 외관 및 / 또는 중재자 패턴입니까?


13

도메인 기반 디자인에서 도메인 계층은 여러 가지 (전통적인) 서비스를 가질 수 있습니다. 예를 들어, 사용자 도메인의 경우 다음이있을 수 있습니다.

  • 다른 방법으로 User 객체를 빌드하는 UserFactory
  • 인프라 계층에서 지속성 서비스와의 상호 작용을 담당하는 UserRepository

도메인 계층의 UserService는 단순히이 두 서비스 및 인프라 계층에 대한 중재자 및 / 또는 외관입니까?



Level Gorodinski 게시물을 많이 읽었지만 두 번째 링크는 보지 못했습니다. 대단한 읽기, 몇 가지 중요한 사항을 확실히 다룹니다!
e_i_pi

답변:


11

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


고맙습니다, 나는 마침내 도메인 레이어를 이해한다고 생각합니다. 데이터 개체 (집계, 엔터티 및 가치 개체)를 보유하는 것과 함께 비즈니스 규칙도 보유하지만 이러한 규칙을 구체적으로 구현하지는 않습니다. 도메인 서비스는 도메인 데이터 개체에 대해 수행 할 수있는 작업을 정의하지만 해당 작업이 내부적으로 어떻게 작동하는지는 모릅니다.
e_i_pi

1
@e_i_pi 비즈니스 규칙은 집계 및 해당 중첩 엔터티에 의해서만 보호됩니다. 도메인 서비스는 여기에 관여하지 않습니다.
콘스탄틴 갈 베누

1
@e_i_pi 여기서 작업에는 둘 이상의 집계가 포함됩니다. 예를 들어 개인 (다른 집계)의 BankAccounts (Aggregates) 목록에서 도메인 서비스는 해당 계정의 총 잔액을 계산합니다.
콘스탄틴 갈 베누

1
@ e_i_pi : 몇 가지 오해가 있다고 생각합니다. 따라서 전체 도메인 계층은 도메인의 소프트웨어 모델입니다. "데이터 개체 (집계, 엔터티 및 값 개체)를 유지하면서 함께"데이터를 보유한다는 의미에서 "데이터 개체"가 아닙니다. 이들은 실제로 도메인 규칙을 구현하고 동작을 정의합니다. 이제, 도메인 서비스 의에 따라 E. 에반스 DDD 책 ,의 이러한 측면이다 도메인 객체 (엔티티 또는 값 객체)에 자연적으로 적합하지 않습니다.
Filip Milovanović

1
오히려 도메인 서비스 는 도메인 모델의 다른 요소로 정의 된 "클라이언트에 대해 수행 할 수있는 작업만으로 순수하게 정의됩니다". 도메인 서비스 자체는 상태 비 저장입니다. 더 높은 수준의 계층에 상주하고 기본적으로 도메인 계층에 대한 인터페이스 역할을하여 사용자 스토리 또는 이와 동등한 사용 사례를 구현하는 Application Services 개념 이 있습니다. 객체 대 서비스의 비율은 모델링되는 도메인에 따라 다릅니다.
Filip Milovanović

1

Dependency Inversion의 결과로 DDD의 서비스를 봅니다 .

"일반"종속성을 사용하는 경우 도메인 코드는 데이터베이스를 호출하여 엔터티 또는 팩토리를 생성하여 엔터티를 만드는 엔터티 또는 팩토리를 저장하거나 쿼리합니다.이 엔터티는 데이터베이스 또는 외부 서비스 또는 다른 종류의 인프라 코드와 연결되어 있습니다.

그러나 이것이 도메인 코드의 방식이 아닙니다. 도메인 코드는 인프라 코드에 의존해서는 안됩니다. 이러한 종속성으로 인해 테스트 및 재사용이 어려워집니다. 그렇기 때문에 그 의존성을 반전시킵니다. 인프라 코드를 도메인 코드에 의존하게합니다. 그렇게하려면 추상화를 도입해야합니다. 도메인 코드가 인프라에 의해 구현 될 것으로 예상되는 동작을 정의하는 추상화입니다.

그리고 DDD의 서비스는 그 추상화입니다. 대부분의 경우 도메인 코드의 경우 해당 서비스는 일반 인터페이스 여야합니다. 그리고 구현은 해당 인터페이스에 의존하는 인프라 코드에 있어야합니다.


귀하의 답변에 감사드립니다. 두 답변이 모두 "aha!" 순간. 나는 당신의 대답이 없다면 개념을 완전히 이해하지는 못했지만 콘스탄틴의 대답은 미래 독자를위한 지표로 선호합니다.
e_i_pi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.