카테고리 보관물: Software

Software

“제어 역전”은 “빈혈 도메인 모델”을 홍보합니까? 무국적 엔티티와 Stateless Services의 대부분의

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

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

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



답변

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

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

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


답변

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

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

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

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


답변

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

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

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


답변

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

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

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

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

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


답변