문제

Eric Evans의 도메인 구동 디자인을 읽은 후 몇 가지 질문이 있습니다. 나는 검색했지만 만족스러운 답변을 찾을 수있는 곳은 없었습니다. 아래 질문이 분명한 이해가있는 사람이 있으면 알려주십시오.

내 우려는입니다

  1. 저장소는 DB, 웹 서비스에서 이미 기존 집계를 얻는 것입니다. 그렇다면 리포지토리는이 엔티티에 대한 트랜잭션 호출도 가질 수 있습니다 (즉, 전송 금액, 계정 세부 정보 보내기 ... 등).

  2. Entity는 이메일을 보내기 위해 인프라 계층 서비스를 호출하는 비즈니스 로직을 가진 방법을 가질 수 있습니다. 로그 등 (엔티티 메소드 호출은 서비스의 대상입니다).

  3. 저장소 구현 및 공장 클래스는 인상 계층에 있습니다. 올바른 진술입니까?

  4. UI 계층 (컨트롤러)이 Repositry 메소드를 직접 호출 할 수 있습니까? 아니면 응용 프로그램 계층에서 이것을 호출해야합니까?

내 마음에는 여전히 많은 혼란이 많이 있습니다 ... 저를 안내 해주세요 ... 책 제가 Eric Evan의 도메인 중심 기반 Desing을 사용하고 있습니다.

도움이 되었습니까?

해결책

  1. 리포지토리가 읽기 전용 또는 거래를 허용 해야하는지에 대한 많은 논쟁이 있습니다. DDD는 이러한 견해를 지시하지 않습니다. 둘 다 할 수 있습니다. 읽기 전용 리포지토리의 지지자들은 모든 CUD 작업에 대한 작업 단위를 선호합니다.

  2. 대부분의 사람들 (자체 포함)은 엔티티가 지속적으로 지적하다는 것이 좋은 관행을 고려합니다. 그 원칙을 약간 확장하면 약간의 인프라 계층 서비스가 비 자격이 없어야한다는 것을 나타냅니다. 따라서 인프라 서비스에 대한 통화는 엔터티에서 운영되는 서비스 클래스에 속합니다.

  3. 저장소 구현 및 공장 (있는 경우)이 인프라 계층에 존재 해야하는 것이 맞습니다. 그러나 인터페이스는 도메인 계층에 존재하여 도메인 서비스가 인프라 계층에 의존하지 않고도 상호 작용할 수 있도록 도메인 계층에 있어야합니다.

  4. DDD는 실제로 레이어를 건너 뛸 수 있는지 여부를 지시하지 않습니다. 이 책의 후반에, 에반스는 레이어링에 대해 조금 이야기하고이를 허용 할 때 편안한 레이어링이라고 부릅니다. 개인적으로 나는 레이어 건너 뛰기를 방지하는 것을 선호합니다. 통화가 이미 올바른 레이어를 통과하는 경우 미래에 일부 동작을 더 쉽게 주입 할 수 있기 때문입니다.

다른 팁

  1. 개인적으로, 최신 DDD 프로젝트에서 나는 nhibernate 세션을 보유한 작업 단위를 사용합니다. UOW는 리포지토리에 주입되어 추가, 제거 및 찾기의 책임을집니다.

  2. Evans는 DDD 책에서 누락 된 퍼즐의 한 조각은«도메인 이벤트»라고 말했습니다. 같은 것을 사용합니다 Udi Dahan의 도메인 완전히 분리 된 아키텍처를 제공합니다 (도메인 객체는 단순히 이벤트를 제기합니다). 개인적으로, 나는 배선을 위해 수정 된 버전의 도메인 이벤트와 구조를 사용합니다. 그것은 내 필요에 적합합니다.

  3. 다른 권장 사항에 따라 저장소 인터페이스가 모델의 일부이며 구현은 인프라의 일부가되는 것이 좋습니다.

  4. 예! 저는 서비스 및 리포지토리가 발표자/컨트롤러 (ASP.NET/ASP.NET MVC)에 주입 한 3 개의 DDD 웹 프로젝트에서 개인적으로 작업했으며 우리의 맥락에서 많은 의미가있었습니다.

  1. 저장소는 엔티티를 찾고 저장하기위한 것이어야하며 해당 계층에는 비즈니스 로직이 없어야합니다. 예를 들어:

    repository.transferamount (금액, toaccount); // 이것은 나쁘다

  2. 엔티티는 도메인에 정의 된 추상화에 의존하는 한 이메일을 보내는 것과 같은 작업을 수행 할 수 있습니다. 구현은 인프라 계층에 있어야합니다.

  3. 예, 저장소 구현을 인프라 계층에 넣습니다.

  4. UI 계층 (컨트롤러)이 Repositry 메소드를 직접 호출 할 수 있습니까? 아니면 응용 프로그램 계층에서 이것을 호출해야합니까?

예, 저는이 패턴을 대부분 따르려고 노력합니다.

[UnitOfWork]
public ActionResult MyControllerAction(int id)
{
    var entity = repository.FindById(id);
    entity.DoSomeBusinessLogic();
    repository.Update(entity);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top