2009-08-26 5 views
5

두 가지 질문DDD principlers 및 ASP.NET MVC 프로젝트 디자인

나는 제품 집계가 있습니다.

가격 PackagingOptions ProductDescriptions ProductImages 등

나는 하나 명의 제품 저장소를 모델링하고 하위 클래스의 개별 저장소를 작성하지 않은

. 모든 db 조작은 제품 저장소를 통해 처리됩니다.

지금까지 DDD 개념을 올바르게 이해하고 있습니까? 가끔 질문은 제 생각에 저장소를 사용하면 패키징 옵션이 제품 저장소에 PackageOptions 컬렉션에서 ID를 사용하여 DB에서 패키지 옵션을 직접 가져 와서 패키지 옵션을 가져 와서 내 삶을 편하게 만들 수 있다고 말합니다. 나에게이 ..

두 번째 부분은 ASP.MVC 프레임 워크

를 사용하여 작업 나는 현재 모든 제품 컨트롤러를 통해 제품의 이러한 자식 컬렉션의 편집 삭제를 추가 관리하려고 만든 편집을 관리 (오른쪽 소리?).

내가 직면 한 한 가지 도전은 다음과 같습니다.

나는/제품/editpackagingoption

에 mydomain /를 통해 제품의 특정 패키징 옵션을 편집 할 경우 10

나는 포장 옵션

의 ID에 액세스 할 수 그러나 나는이 없습니다 제품 자체의 ID로 인해이 특정 패키징 옵션이있는 제품을 먼저 찾은 다음 해당 제품과 revelant 패키징 옵션을 편집하는 쿼리를 작성해야합니다. 모든 패키징 옵션의 고유 ID가 있기 때문에이 작업을 수행 할 수 있지만 고유 ID가없는 컬렉션이 있으면이 작업이 실패합니다. 아주 잘못된 느낌

..

내가 같은 URL에 제품 및 포장 옵션 ID를 모두 전송하는 생각 다음 옵션;

에 mydomain/제품/editpackagingoption/10분의 3

하지만 그 중 좋은 디자인이면 나는 확실하지 않다.

나는 약간 혼란 스럽다. 이 모든 것을 둘러싼 근본적인 오해가있을 수 있습니다 ...

오랜 질문에 빠져 나와 함께 생각해 주시면 감사하겠습니다. 감사!

+0

좋은 질문을 걱정할 필요가 없습니다. 나는 그것을 대답 할 수 없다. 그러나 제품 id를 가지고 있지 않은 것에 관해서는, 그 것이 중요합니까? 일대일 일 경우 PackingOption에 자체 ProductID가 있어야합니다. – jeef3

+0

데이터베이스에 유지되는 productid가 있습니다. challenge는 packagingoption 저장소가 없어도 어떻게 얻을 수 있는가입니다. – kaivalya

답변

3

내 생각에 이것은 DDD에 나타나는 진흙탕 중 하나입니다.

코드에서 집계 루트는 집계 루트를 가진 "관계"와 집계 루트 없이는 존재할 수없는 모든 엔터티 개체의 컨테이너로 취급합니다.

예를 들어, 고객 -> 주문 -> LineItem -> 제품 예를 살펴 보겠습니다. 이 시나리오에서 표시된대로 집계 루트는 고객입니다. 즉, 항상 고객을 통해 주문을 받고 싶지는 않습니다.특정 날짜에 주문을 찾을 수 있습니다.

고객 측면에서는 주문이없는 고객도 없을 것입니다. 두 사람은 다소 공생 관계에 있으므로 다른 사람의 뿌리가 아닙니다.

요점은 고객이 주문을 통해로드하지 않아도되지만 반드시 고객을 통해 주문을로드 할 필요가 없다는 것입니다.

그러나 Order에서 시작하면 LineItem을 검색하는 것이 쉽지 않으며 주문없이 만들 수는 없습니다. 이를 위해 Order는 LineItem에 대한 게이트웨이 역할을합니다. LineItems에는 자체 컨트롤러 나 저장소가 필요하지 않습니다. 그것들은 Order 자체 내에 만 존재하며, 그 자체로 Order의 일부분입니다 (이 경우, Order는 집계 루트가됩니다). 그리고 Order Entity에 의해 관리됩니다.

그러나 LineItem은 시스템 내의 Product와 관계가있을 수 있습니다. 제품은 집계 루트 외부에 존재할 수 있기 때문에 자체 컨트롤러, 리포지토리 등을 보유하게됩니다.

요약하면, 나는 이것을 다음과 같이 보는 경향이 있습니다. 엔티티 자체가 존재할 수 있다면 컨트롤러가 있어야합니다. 자체적으로 존재할 수없는 엔티티 (이 경우 LineItem)는 컨테이너 (집계 루트)에 의해서만 관리되어야합니다.

일부 DDD 순수 개발자가/틀린 부분을 수정 해 주시겠습니까?

질문의 두 번째 부분에 대해서는이 다른 엔티티의 작동 방식을 자세히 설명해야합니다. 여기에 넣은 내용으로 PackagingOptions은 제품과 관련이 있으며 Product aggregate root의 일부가 될 것이라고 생각합니다. 이제, 당신이 편집하고 있다는 것을 암시하는 것은 이것이 시스템의 룩업 테이블인지 또는 일회성 값인지, 그리고 그 자체로 값 객체로 취급되어야하는지에 대한 질문을 제기합니까?

+0

답변 해 주셔서 감사합니다. 이 모든 질문을 제기 한 뿌리를 모으기 위해 좀 더 근본적인 접근 방식을 취할 때까지 우리는 같은 페이지에서 친절한 듯합니다. 질문에 관해서; 내가 가치 객체라고 생각하는 포장 옵션을 다시 살펴 보겠습니다. 하지만 내 질문은 컨트롤러에 자식 엔터티의 ID를 전달하고 모든 나머지를 처리하는 집계 컨트롤러까지 전달하는 집계 루트의 엔터티에 대한 시나리오를 편집하는 방법에 관한 것입니다. 두 가지 집계 ID 이러한 경우에 대한 자식 id는 여전히 혼란 스럽다고 느낀다. – kaivalya

+0

자식 엔티티에 id가 있고 해당 엔티티를 편집해야하는 경우 자체 컨트롤러를 보증해야한다고 주장합니다. 부모 관계를 얻는 데있어 1 : 1이면 부모 ID를 자식과 함께 저장하고 방금 가져옵니다. 그러나 부모를 저장하여 자신의 ID를 가진 자식을 수정하면 나에게 약간의 냄새가납니다. 엔티티 자체를 편집하는 경우 집계를 편집하지 않고 독자적으로 설 수 있어야하는 것이 있습니다. 주문을로드하여 제품을 편집하고 싶지 않아 작동하지 않을 것 같습니다. 또한 가치 객체에는 ID가 없습니다. – andymeadows

+0

엔티티 및 값 객체에 대한 설명은 http://devlicio.us/blogs/casey/archive/2009/02/13/ddd-entities-and-value-objects.aspx를 참조하십시오. – andymeadows

1

Kaivalya, 마지막 코멘트 (무 HTTP)에 관한

는 :

그것은 상황에 따라 달라집니다. 세부 사항을 설명하기 전에 집합에 대한 기본 원칙을 말해야합니다.

데이터 집합을 변경하기 위해 단일 단위로 처리해야하는 그룹을 정의합니다.

이것은 매우 중요합니다. Aggregates를 가지는 목적은 불변량을 강제하는 것입니다. 예를 들어 "주문은 $ 500를 초과 할 수 없습니다"와 같은 정책이있을 수 있습니다. 그런 다음이 정책을 적용하기 위해 Order W OrderItem을 Order Aggregate에 함 2 넣습니다. 이렇게하면 새 OrderItem을 추가 할 때마다 Order 오브젝트를 통해 추가해야합니다. 거기에서 총 가격을 확인하고 $ 500를 초과하지 않는지 확인할 수 있습니다. 도메인에 이러한 불변성이없는 경우 이러한 모든 객체를 함께로드 할 필요가 없습니다.

이제, 당신의 의견에 점점 :

당신이 시행되어야한다 불변이있는 경우

, 다음이 일부 오버 헤드가 있더라도 전체 집계를로드 할 수 괜찮습니다. 예, HTTP는 상태 비 저장이며 하위 개체 중 하나를 수정하기 위해 전체 집계를로드 한 다음 버립니다. 괜찮아. 여기서 가장 중요한 것은 당신이 당신의 불변성을 강요하고 있다는 것입니다. 이것이 DDD의 목적입니다.

DDD의 목적은 도메인의 모든 비즈니스 논리를 캡처하는 것입니다.전체 집계를로드 할 필요가 없다면 더 나은 성능을 얻을 수 있지만 불변량을 어떻게 적용 할 수 있습니까? 저장 프로 시저에서이 작업을 수행해야 할 가능성이 큽니다. 예, 작동하며 빠르지 만 유지 관리 중에 저장 프로 시저의 비즈니스 논리를 처리하는 것은 악몽입니다. 그것이 바로 DDD가 진화 한 이유입니다. 따라서 객체 지향 언어/도구를 사용하여 비즈니스 요구 사항을 모델링 할 수 있으므로 이해하고 수정하기가 더 쉽습니다.

DDD는 모든 유형의 프로젝트에서 좋은 접근법이 아니라는 점을 기억하십시오. 비즈니스 로직이 많이 있고 비즈니스의 특성으로 인해 변경 될 가능성이 높은 프로젝트를 처리하는 경우 DDD를 사용해야합니다. 그러나 프로젝트가 많은 비즈니스 논리없이 "뭔가를 읽고 쓰는 것"에 더 가깝다면 DDD를 사용하는 것이 두통입니다. LINQ to SQL (또는 SqlDataAdapters)을 사용하여 개체를보기로 보낼 수 있습니다. 당신은, 찾는 엔터티 값 개체, 집계, 저장소 등

희망이 도움에 대해

MOSH