"제어 역전"은 "빈혈 도메인 모델"을 홍보합니까?


32

마지막 프로젝트에서 IoC 컨테이너를 사용했을 때 무국적 엔티티와 Stateless Services의 대부분의 비즈니스 로직으로 끝났습니다.

"Inversion of Control"을 사용하는 다른 개발자가 작성한 프로젝트를 보았으며 항상 "Anemic"입니다.

"Anemic Domain Model"은 안티 패턴이므로 IoC 및 Rich Domain을 사용할 수 있습니까? 그들의 좋은 예, 그렇게하는 오픈 소스 프로젝트입니까?


도움을 받으려면 특정 사례의 특정 예를 확인해야한다고 생각합니다.
Martijn Verburg

1
미안 해요, 코드 조각 : 의미
마티 Verburg을

답변:


11

우선 : DI와 IoC 동의어 가 아닙니다 . 미안하지만 그 점을 지적해야합니다 (당신이 생각한다고 생각합니다).

귀하의 문의에 관해서 ... 음, 의존성 주입은 도구 일뿐입니다. 이 도구를 사용하는 방법은 완전히 별개의 것입니다. 문제를 일으킬 수있는 다른 도구 (디자인 패턴)도 있습니다. 예를 들어, MVC 패턴을 광범위하게 채택하는 것이 Anemic Domain Model 안티 패턴을 형성하는 데 중요한 요소 중 하나라고 생각합니다. Business Layer는 데이터베이스 엔터티에 일대일로 매핑되어 일반 ORM 인 단순한 데이터 액세스 레이어로 바뀝니다.

확실히 응용 프로그램을 디자인하는 방법입니다. 원하는 경우 올바른 도메인 모델을 생성 할 수 있으며 이러한 모든 IoC, DI, MVC가 멈추지 않습니다. 당신을 막을 수있는 것은 당신의 팀입니다. 어떻게 든 올바른 경로를 사용하도록 설득해야하며 많은 소프트웨어 개발자가 강력한 아키텍처 배경을 가지고 있지 않기 때문에 어려울 수 있습니다.


에릭 에반스 (Eric Evans) 등이지지 한 DDD 접근 방식을 엿볼 수있을 것입니다.
Martijn Verburg

1
에릭 에반스의 책을 읽었습니다. 일반적인 방법론과 유비쿼터스 언어에는 좋지만 실제 예제에는 다소 부족합니다.
Mag20

DI와 IoC의 차이점을 지적 해 주셔서 감사합니다. 문제는 IoC보다 DI와 더 관련이 있다고 생각합니다. 그것을 반영하기 위해 질문을 변경했습니다.
Mag20

DI 프레임 워크 / 컨테이너 (봄 DI, CDI, 유니티) 내 경험에 의하면, 그들은 실제로 않는 나에게 사실 (즉, 상태) 객체를 사용하는 제한해야하는 것이 아닌 개발자를 의미한다 "올바른 도메인 모델"을 만들기에서 당신을 중지 . 그러나 DI는 실제로 그것을 지원하지 않습니다.
Rogério 2016 년

8

대부분의 (전부는 아님) 응용 프로그램은 인프라와 도메인 문제의 혼합입니다. 특정 수준의 복잡성에 도달하면 도메인이 인프라와 분리되어 있는지 쉽게 관리 할 수 ​​있으므로 추론하기 쉽고 독립적으로 발전 할 수 있습니다.

물론 도메인 모델은 여전히 ​​나머지 시스템과 통신해야하며 일반적으로 이는 인프라 관련 문제 (예 : 데이터베이스 액세스)가 주입 된 상태 비 저장 서비스 (도메인의 일부)와 관련이 있습니다. IoC 컨테이너를 사용해도이 종속성이 제거되지 않고 구성을 별도의 영역으로 이동하여 추론하고 유지 관리하기가 더 쉽습니다.

엔티티는 상태를 저장하고 있으며 비즈니스 규칙을 책임 져야합니다. 서비스가 모든 불변 및 기타 비즈니스 규칙을 시행하는 경우 논리가 잘못된 위치에있을 수 있습니다.

이제 올바른 장소에 논리가 있지만 여전히 인프라와 물건을 둘러싼 엔티티를 감싸는 서비스에 불과한 경우 도메인이 정당화하기에 충분히 복잡하지 않을 가능성이 큽니다. 자체 모델의 오버 헤드 DDD에 대해 읽을 내용은 복잡한 도메인에만 적용되는 면책 조항이 포함되어 있지만 너무 자주 잊혀진 것 같습니다.


7

소스로 이동하십시오. Anemic Domain Models 에서 Fowler의 작품으로 시작하십시오 . 그는 Eric Evan의 도메인 기반 디자인을 모범 사례의 예로 언급합니다. 이에 대한 소스 코드는 여기에 있습니다 . 다운로드 해.

Inversion of Control (@Autowired 검색)을 사용하고 서비스 클래스 (BookingService)와 "비즈니스 프로세스"클래스 (예 : ItineraryUpdater)가 있는지 확인하십시오.

Fowler의 원본 기사는 여러분이 찾고있는 예제의 흔적을 시작합니다.


이 샘플 앱은 실제로이 책에서 설명한 DDD를 따르지 않습니다. 이 책과의 모순은 "특정 인프라"개념을 완전히 위반한다는 것입니다. 예를 들어, VoyageRepositoryHibernate인프라 계층에 배치되었지만 실제로는 도메인 계층에 따라 달라지는 클래스입니다.
Rogério 2016 년

그렇습니다.이 책은 73 페이지의 인프라 계층이 도메인 계층 "아래"에 있으며 "서비스중인 도메인에 대한 특별한 지식이 없어야합니다"라고 말합니다. 이것은 나에게 결코 의미가 없었습니다. VoyageRepository 구현, VoyageRepositoryHibernate 및 VoyageRepositoryJDBC 클래스가있는 프로젝트를 고려하십시오. 그들의 구현은 반드시 매우 다르며 기술에 따라 다릅니다. 이들은 도메인 계층에 속합니까? 아니면 인프라 계층? 이 책의 코드에 따르면 코드에서는 거꾸로합니다. 인프라 계층은 도메인 계층을 참조 할 수 있지만 그 반대는 아닙니다.
jamie

그들은 도메인 계층에 속합니다. JDBC 기반 구현에는 도메인과 관련된 응용 프로그램 데이터베이스의 테이블과 열에 연결된 SQL 코드가 포함됩니다. "인프라 코드"는 기술적 인 문제를 해결하는 데만 사용해야하며 다른 응용 프로그램과 도메인간에 (이상적으로) 완벽하게 재사용 할 수 있어야하기 때문에 도메인 또는 애플리케이션 별 코드를 인프라 계층에 두는 것은 잘못입니다. 도메인 계층에 "낮은 수준의"코드 (예 : SQL)를 사용하는 솔루션은 코드를 완전히 옮기는 것이 아니라 ORM과 같은 더 나은 인프라 위에 구현하는 것입니다.
Rogério

나에게 save (MyDomainObject foo) 구현은 순수한 기술적 관심사입니다. YMMV.
jamie

계층 구조의 기본 규칙을 위반하지 않는 경우에만 : 하위 계층 상위 계층에 의존 할 수 없습니다 . 따라서 save(foo)도메인 모델이 변경 될 때 변경 될 수있는 코드로 구현 한 경우 (예 : 새 속성이에 추가되는 경우 MyDomainObject) 정의에 따라 도메인 계층에 속해야합니다. 그렇지 않으면 더 이상 "레이어"를 갖는 것에 대해 이야기 할 수 없습니다.
Rogério

7

IoC 및 Rich Domain을 사용할 수 있습니까? 그들의 좋은 예, 그렇게하는 오픈 소스 프로젝트입니까?

IoC 대신 DI를 의미한다고 가정하고 작업 한 프로젝트는 Spring과 같은 DI 컨테이너를 사용합니다. IoC에는 DI와 로케이터 패턴의 두 가지 주요 특징이 있습니다. 로케이터 패턴이 왜 문제가되는지 모르겠으므로 DI에 초점을 맞추겠습니다.

나는 그것이 가능하지 않다고 생각하거나 적어도 매우 실용적이지 않을 것이라고 생각합니다. DI 컨테이너의 주요 특징은 다른 컨테이너 ( "관리 대상 개체")에 개체를 주입 할 때 개체 생성을 제어한다는 것입니다. 프로젝트를 실행할 때 활성 상태 인 관리되는 개체 집합은 프로젝트에 존재하는 도메인 항목과는 별개이지만 개체를 ​​연결하는 방법과 할당 된 범위 (단일, 프로토 타입)에 따라 다릅니다.

이것이 DI 컨테이너가 도메인 객체를 관리하게하지 않기를 원하는 이유입니다. 그러나 새 개체를 사용하여 수동으로 개체를 만들면 다른 개체를 도메인 개체에 주입 할 수 없습니다. (수동 배선을 제외하고 잠재적 인 해결 방법을 남겨 두십시오.) 구현을 다른 것으로 대체하기 위해 이러한 주입이 필요하므로 DI를 사용하여 리치 도메인 오브젝트의 기능을 대체 할 수 없습니다. 따라서 기능을 도메인 개체에 배치하지 않으려는 경우 DI의 기능을 잃게됩니다.

객체를 관리하지 않는 가상의 DI 컨테이너가 어떻게 작동하는지 알 수 없으며 기존 구현에서는 허용하지 않습니다. DI가 개체 관리에 의존한다고 주장하는 것은 공정합니다. 따라서 항상 잠재적 인 리치 도메인 오브젝트를 하나의 빈혈 클래스와 하나 이상의 트랜잭션 스크립트 클래스로 나누도록 유혹합니다.


이 답변은 리치 도메인 모델과 의존성 주입 사이의 긴장과 관련하여 실제로 머리에 못을 박았습니다.
jrahhali
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.