2009-07-22 3 views
4

DDD에서 종속 개체를 삭제하거나 삭제하지 않는 논리는 어디에 속합니까?DDD (Domain Driven Design)에서 종속 객체를 삭제하기위한 논리가 있습니까?

class Category 
{ 
    IList<Products> products; 
} 

규칙이 더 제품이없는 경우를 제외하고 범주는 삭제할 수 없습니다 수 있습니다 : 예를 하나 들어

제품을 포함하는 범주가 있습니다.

논리가 어디에 속하는가? 삭제하기 전에이 카테고리에 속한 제품이 없는지 확인하십시오.

  • 도메인 클래스 - 비즈니스 논리로 보이므로 도메인 계층에 속한다고 추측합니다.
  • 리포지토리 클래스 - 리포지토리 계층은 지속성을 처리하며, 삭제를 포함하여 일반적인 CRUD 메서드를 포함하며 논리가이 계층에 속합니까?
  • 다른 해결책?

답변

2

소프트웨어 디자인에 대한 대부분의 아이디어와 마찬가지로 DDD는 엄격하고 빠른 규칙이 아닌 지침 집합이므로 기억해야 할 점은 실제 DDD인지 여부에 대해 너무 걱정하지 마십시오. . 대부분의 소프트웨어 시나리오와 마찬가지로 대답은 "다릅니다."

이 시나리오에서는 Specification을 사용하는 것이 좋습니다.

Category category; // some category you're working with. 
ICategoryRepository _categoryRepository; // some repository. 

ISpecification readyForRemoval = new ReadyForRemovalSpecification(); 

if (readyForRemoval.IsSatisfiedBy(category) 
{ 
    _categoryRepository.Remove(category); 
} 

public class ReadyForRemovalSpecification : ISpecification<Category> 
{ 
    public bool IsSatisfiedBy(Category category) 
    { 
    return (category.HasProducts == false); 
    // return category.Products.Count = 0; // whatever... 
    } 
} 
+0

"return! category.HasProducts;" 혹시? –

+1

@Bryan Watts, OT & FYI : 읽을 의도가 있고 실행되지 않는 코드를 작성할 때 종종 "! x"대신 "x == false"를 사용하는 것을 선호합니다. 카테고리가 제품에 속한 제품보다 "제품에 카테고리가 같음"이라고 읽는 것이 더 효과적이라고 생각합니다. 그냥 개인적인 취향. 실제 시나리오에서는! category.HasProducts를 사용합니다. –

+0

@KevinSwiber이 게시물은 오래되었지만 제공 한 코드가 어디에 있어야하는지 (예 : 질문)? 도메인 계층 또는 서비스 계층? 감사 –

0

일반적으로 집계 루트는 하위 항목의 수명을 관리합니다.

관련 문제