2

저는 DDD, 작업 단위, 도메인 서비스, 응용 프로그램 서비스 등에 관한 모든 정보에 다소 압도되어 있습니다. 나는 지속성 - 무지한 도메인 모델이 궁극적으로 어떻게 지속되는지, 특히 문맥에서 작업 단위 및 Entity Framework에 대해 설명합니다. 이제 내가 내 지속성 무지 도메인 모델 (내 건축 양파의 핵심)을 유지하려고하고 주문서 집계 루트를 가지고 있다고 가정 해 봅시다 :Entity Framework를 사용하여 DDD에서 지속성 및 작업 단위를 어떻게 처리합니까?

public class Order : EntityBase 
{ 
    public int Id { get; private set; } 
    public int MarketplaceId { get; private set; } 
    public int CustomerId {get; set;} 
    public List<OrderItem> Items { get; private set; } 
    public List<OrderComment> Comments { get; private set; } 

    public void AddItem(OrderItem item) { /**add item**/ } 
    public void AddComment(OrderComment comment) { /**add comment**/ } 
    public override bool Validate() { /**validate**/ } 
    public void Cancel() { /**cancel**/ } 
} 

의 내가에 속성을 업데이트하는 프로세스를 가정 해 봅시다 주문 엔터티. 예를 들어 주문과 연결된 CustomerId가 변경됩니다.

나는이 같은 기능 (외부 층에서) 구현을 것이다, 내 도메인 층에 IOrderRepository 있습니다

Order GetOrder(int orderId) 
{ 
    //get entity framework order, items, etc. 
    //map to domain-layer order and return domain-layer order 
} 

void UpdateOrder(Order order) 
{ 
    //get ENTITY FRAMEWORK order, order items, order comments, etc. 
    //take DOMAIN order (passed in to this function), and update EF items fetched above 
    //use a single EF unit of work to commit these changes 
} 

내 접근 방식에 문제가있다. UpdateOrder 함수는 작은 변화로 인해 무거워 보입니다. 내 저장소가 persistence-ignorant 도메인 모델의 어떤 항목을 변경했는지 알지 못하는 경우에도이를 수행해야합니다. 별도의 저장소 기능에서 모든 유형의 업데이트를 처리해야합니까? UpdateMarketplace (int marketplaceId), UpdateCustomer (int customerId)?

내가 입력 할 때, 나는 또한 궁금해 할 것입니다 ... 아마도 내가 가지고있는 방법이 너무 무겁지 않을까요? 하나의 속성을 변경하면 위의 모든 작업을 수행하더라도 Entity Framework에서 할당되는 값이 동일하고 하나의 db 열 업데이트 만 SQL에 보내지는 것을 인식하게됩니까?

주문 도메인 모델 (가져 오기가 간단 함)을 사용하고 범위가 제한 될 수있는 일부 작업이나 연산을 수행 한 다음 Entity Framework를 사용하여 모델을 유지할 수 있습니까?

답변

0

Unit of Work 패턴을 조사해야합니다. UoW는 변경 사항을 추적하므로 리포지토리에서 주문을 받고 수정할 때 UnitOfWork.SaveChanges()를 호출하면 모든 변경 사항을 유지해야합니다.

Entity Framework를 사용하면 기본적으로 DbContext가 작업 단위이지만, 상위 인터페이스에서보다 쉽게 ​​사용하기 위해 추상화 할 수 있도록 간단한 인터페이스가 만들어집니다.

EF와 관련하여 코드 첫 번째 방법을 사용하여 도메인 엔터티를 직접 매핑하는 것이 좋습니다. 나 또한 게으른 로딩과 모든 마법 물건을 꺼서 모든 것을 제어하고 덜 놀랄 수 있습니다.

불행히도 코드를 공유 할 수는 없지만 새로운 EF6 Alpha 3를 사용하면이 모든 작업을 매우 효과적으로 처리 할 수 ​​있습니다. 일부 구현 예는 Microsoft 스페인 nlayerapp을 살펴 보는 것이 좋습니다. 나는 많은 디자인 결정에 동의하지 않는다. (역시 review을 보라.)하지만 나는 Entity Framework 파트에서 영감을 얻을 수 있다고 생각한다. 그들의 Unit of Work implementation을 살펴보고 특히 상위층에서의 사용이 더 용이하도록 응용 프로그램을 추상화 한 방법과 응용 프로그램 서비스에서이를 사용하는 방법에 대해 살펴보십시오.

집계 된 특정 리포지토리에서 많은 로직을 복제하지 않으려면 일반 리포지토리를 만드는 것이 좋습니다. MS 스페인의 주소는 here이지만이 주소는 thread입니다.

+0

입력 해 주셔서 감사합니다. 이것이 더 활발한 기록 패턴이 아니겠습니까? 내 도메인 객체가 데이터베이스 객체와 1 : 1 속성 관계를 갖고 있지 않은 경우에는 어떻게해야합니까? 엔티티를 직접 매핑하지 않으면 1 : 1 관계로 커밋하고 어떤 의미에서는 내 도메인 모델을 지속성과 결합하게됩니까? – Josh

+0

코드 우선 접근법을 사용할 때 매핑이 꽤 유연하기 때문에 1 : 1 관계로 완전히 커밋하지 않을 것입니다. 하지만 문제가 발생하여 1 : 1 매핑을하는 것처럼 느껴질 수도 있습니다. 당신은 여전히 ​​다른 레이어를 수행하고 둘 사이에서 변환 할 수 있지만 자동 변경 추적을 일부 풀어 놓습니다. –

+0

도메인 개체에서 데이터 개체로 변환 할 때 EF를 사용하면 첨부를 호출하여 컨텍스트에 연결해야하며 상태를 수정 됨으로 설정해야합니다. SaveChanges를 호출 할 때 저장됩니다. 이 [link] (http://msdn.microsoft.com/en-US/data/jj592676)를 참조하십시오. 내 게시물에 링크 된 UOW/저장소 패턴을 참조하십시오. 여기에는 이러한 종류의 작업을위한 메서드도 포함되어 있습니다. –

-1

SO question을 보시고 여기에 내가 어떻게 UoW & 리포지토리를 구현했는지 보여주는 예를 들려주십시오[email protected] 야콥 센이 말했듯

는 도메인 엔티티는 쓸모 매핑 레이어를 추가 할 수 피할 것, 당신의 EF 엔티티해야합니다.

희망 하시겠습니까?

관련 문제