2010-04-29 5 views
1

모델 첫 번째 방법을 연습하고 도메인 모델을 구성하고 있습니다. 내 요구 사항은 매우 간단합니다. UserSession은 여러 ShoppingCartItem을 가질 수 있습니다.Linq2Sql 엔터티 위에 도메인 모델을 적용하십시오.

부분 클래스를 사용하여 생성 된 Linq2Sql에 도메인 모델 인터페이스를 적용 할 것이라고 말하기 시작해야합니다. 요구 사항은 세 개의 데이터베이스 테이블 (UserSession, Product, ShoppingCartItem, ProductId 및 UserSessionId는 ShoppingCartItem 테이블의 외래 키임)으로 변환됩니다. Linq2Sql 나를 위해 이러한 엔티티를 생성합니다. 이 시점에서 데이터베이스를 다루지 않아야한다는 것을 알고 있지만 언급하는 것이 중요하다고 생각합니다.

UserSession 없이는 ShoppingCartItem이 존재할 수 없으므로 집계 루트는 UserSession이지만 나머지는 분명하지 않습니다. 제품은 어떻습니까? 그것은 실재적으로 엔티티이지만 ShoppingCartItem과 연관되어 있어야합니까? 여기

(그들은 모든 잘못 구현 될 수 있음) 몇 가지 제안은 다음과 같습니다

public interface IUserSession { 
    public Guid Id { get; set; } 
    public IList<IShoppingCartItem> ShoppingCartItems{ get; set; } 
} 

public interface IShoppingCartItem { 
    public Guid UserSessionId { get; set; } 
    public int ProductId { get; set; }   
} 

가 또 다른 하나가 될 것이다 :

public interface IUserSession { 
    public Guid Id { get; set; } 
    public IList<IShoppingCartItem> ShoppingCartItems{ get; set; } 
} 

public interface IShoppingCartItem { 
    public Guid UserSessionId { get; set; } 
    public IProduct Product { get; set; }   
} 

세 번째 하나는 다음과 같습니다

public interface IUserSession { 
    public Guid Id { get; set; } 
    public IList<IShoppingCartItemColletion> ShoppingCartItems{ get; set; } 
} 

public interface IShoppingCartItemColletion { 
    public IUserSession UserSession { get; set; } 
    public IProduct Product { get; set; }  
} 

public interface IProduct { 
    public int ProductId { get; set; }  
} 

내가 내 마음이 데이터베이스 모델과 테이블과 너무 밀접하게 결합되어있어이를 파악하기 어렵다는 느낌을 갖습니다. 누구나 감히 신경 쓸 수 있니?

답변

2

제대로 된 것처럼 보입니다. 전체 "DDD를 올바르게 수행하는 것"의 절반은 적절한 기초 수업을 가지고 있습니다. 이 위대한 DDD에서 보면 C 번호 자원에 적용한 :

http://dddpds.codeplex.com/

소스 코드를 사용할 수있는 매우 읽을 수 있습니다.

그래서 모델에 ID가있는 것과 관련하여. ID는 데이터베이스이며 일반적인 접근 방법은 모델에서 모든 지속성을 유지하고 모델을 비즈니스 로직으로 제한하는 것입니다. 그러나, 하나는 일반적으로 식별자에 대한 예외를 만드는 등 같은 모델의 기본 클래스에 묻은 :

public class ModelBase { 
    protected readonly object m_Key; 
    public ModelBase(object key) { 
    m_Key = key; 
    } 
} 

이 키는 데이터베이스에 얘기를 당신의 영속 계층에서 사용하는 불투명하다. 당신이 그것이 무엇인지 알기 때문에 필수 유형으로 키를 다운 캐스팅하는 것은 꽤 괜찮은 것으로 간주됩니다.

또한 도메인 개체는 아키텍처 스택의 맨 아래에 있습니다 (인프라 계층 바로 위). 즉, 구체적인 수업을 만들 수 있습니다. 도메인 모델을 여러 번 구현할 필요가 없으므로 인터페이스가 불필요합니다. 즉, Domain Driven Design의 개념 인 도메인 우선입니다.

public Class UserSession : ModelBase { 
    public UserSession(Guid Id):base(Id) {} 

    public Guid Id { get{ return m_Key as Guid;} } 
    public IList<ShoppingCartItem> ShoppingCartItems{ get; set; } 
} 

public class ShoppingCartItem : ModelBase { 
    public ShoppingCartItem():base(null) {} 

    public UserSession UserSession { get; set; } 
    public Product Product { get; set; }   
} 
+0

Igor, ShoppingCartItem 엔터티에 Quantity를 추가하려면 어떻게해야합니까? 나는 public int에 추가 할 것인가? Quantity {get; 그것을 설정;}? – Thomas

+0

예. 그것은 도메인 속성으로 나를 공격하므로 모델에 속합니다. –

1

일반적인 장바구니 또는 고객 주문 예에서는 UserSession (또는 Order)을 집계의 루트로 사용하는 것을 선호합니다. 개별 항목은이 세션/주문의 하위 항목이어야합니다. 장바구니의 개별 항목에 의미있는 ID가 있어야하는지 여부가 결정됩니다. 장바구니에있는 5 개의 위젯은 다른 5 개의 위젯과 구별 할 수 없으므로 아니오를 선호합니다. 따라서 장바구니 항목을 가치 개체의 컬렉션으로 모델링합니다.

쇼핑 카트 항목의 일반적인 문제점은 가격을 포함해야하는지 여부입니다.가격을 포함 시키면 제품 가격의 변화와 무관하게 카트가 생깁니다. 카트를 구입할 때 가격에 따라 카트가 얼마나 많은지 알 수있는 가치가 있기 때문에 과거의 이유로 카트를 보관하려면 매우 바람직합니다.

제품은 반드시 자체적으로 집합체를 형성해야합니다. 기간.

지금이 모든 것이 LINQ to SQL에서 쉽게 구현할 수 있는지는 모르겠지만 시도해 볼 수는 있습니다.

관련 문제