2014-12-02 7 views
2

도메인 모델은 일반 객체로 간주되기 때문에 지속성을 어떻게 처리합니까? 응용 프로그램 계층에서 모든 지속성을 만들어야한다는 것을 이해하지만, 도메인 모델은 응용 프로그램 계층에 저장소로 전달하기 위해 필요한 CRUD 작업을 어떻게 알 수 있습니까?도메인 모델로 지속성을 어떻게 처리합니까?

제안 사항?

+3

도메인 객체 지속성이 문제를 처리하는 저장소로 전달된다. – plalx

+0

감사합니다 plalx, ​​그게 내 현재 프로젝트에서 어떻게하는지. DDD를 구현하는 방법에 대한 결정을 내려야 할 때 ... 나는 항상 내가 잘못하고있는 것처럼 느낍니다. – nrivero

+1

"DDD 전술 패턴"에 대한 검색을 수행하면 의심이됩니다. – plalx

답변

1

도메인이 응용 프로그램 계층에 CRUD 작업을 알리지 않습니다. 도메인 객체를 유지할 방법 또는시기를 알지 못합니다. 주어진 애플리케이션 트랜잭션을 종결하고 변경 사항을 영구 저장소로 플러시 할시기를 결정하는 것은 애플리케이션 계층입니다.

-1

Domain Services 당신이 찾고있는 개념입니다.

도메인 서비스가 엔터티/도메인 개체에 삽입됩니다. 도메인 객체는 인터페이스를 통해 서비스를 호출합니다.

EDIT :이 예는 C#입니다. 왜냐하면 내 모국어이기 때문입니다. 언어에 'interfaces'에 대한 지원이있는 경우 여기에서 개념을 적용 할 수 있습니다.

public class Program 
{ 
    public static void Main() 
    { 
     Order myOrder = new Order(new OrderRepository()); 

     myOrder.Save(); 
    } 
} 

public interface IOrderRepository 
{ 
    void Save(Order order); 
} 

public class OrderRepository : IOrderRepository 
{ 
    public void Save(Order order) 
    { 
      // Persistence stuff here 
    } 
} 

public class Order 
{ 
    private IOrderRepository _orderRepository; 
    public Order(IOrderRepository orderRepository) 
    { 
     _orderRepository = orderRepository; 
    } 

    public void Save() 
    { 
     _orderRepository.Save(this); 
    } 
} 
+0

엔티티에 지속성 세부 정보를 알리려면 DDD 핵심 원칙에 위배됩니다. 응용 프로그램 서비스는 저장소와 상호 작용할 책임이 있으며 엔터티는 저장소에 대해 알 필요가 없습니다. – plalx

+0

@plalx : 엔티티가 인터페이스를 통해 서비스에 액세스하는 한 엔티티가 응용 프로그램 서비스에 대해 알기에 완벽합니다. "주문 저장"은 도메인 명령이기 때문에 주문 엔터티에 "저장"방법이 있습니다. 순서가 저장되는 방식은 서비스의 구현에 달려 있습니다. 서비스는 느슨하게 엔터티에만 연결됩니다. 이것은 표준 종속성 주입 기술입니다. 물론 엔터티에 DB 액세스 코드를 넣으면 안됩니다. 나는 이것이 "DDD 핵심 원칙에 반하는"방법에 대해보고자하지 않습니다. 무슨 뜻인지 구체적으로 설명하십시오. –

+0

@plalx : 또한 엔티티에 대한 귀하의 의견은 "지속성 세부 정보를 알고 있습니다"는 잘못되었습니다. 필자의 예에서는 엔티티가 인터페이스를 통해 저장소에만 액세스하기 때문에 엔티티는 지속성 세부 사항을 알지 못합니다. 엔터티는 "how"가 아닌 "what"만을 알고 있습니다. –

0

응용 프로그램의 responsabilty 도메인의 작업을 조율하는 것입니다. 도메인 개체에는 논리 규칙과 비즈니스 규칙이 있지만 응용 프로그램의 모든 흐름을 알지 못합니다. 응용 프로그램을 실행하는 데 필요한 단계 수는 응용 프로그램 계층에 있어야합니다. 저장소은 지속성을 처리하지만이를 호출하는 응용 프로그램입니다.

예 :

Customer customer = customerRepository.GetById(2); 
customer.Rename("Jhon Doe"); 
customerRepository.Save(customer); 
관련 문제