1

도메인 기반 디자인을 사용하여 응용 프로그램을 개발하고 있습니다. 내가 사용한 패턴 중 하나는 저장소 패턴입니다. 간단히하기 위해 클래스와 인터페이스를 따르고 있다고 가정 해 봅시다.도메인 기반 디자인 - 도메인 객체에서 하나의 속성의 고유성을 확인하는 방법

자동차 도메인 개념을 나타내는 자동차 도메인 클래스.

public class Car { 
    public int Id {get;private set;} 
    public string SomeUniqueCode {get;private set;} 
} 

ICarRepository - Car 개체의 변경 내용을 추가, 삭제 또는 저장하기위한 인터페이스입니다.

내 문제는 데이터베이스의 모든 Car 개체 중에서 SomeUniqueCode 속성의 고유성을 확인하는 방법입니다. 이 특성은 오브젝트 라이프 사이클 중 언제든지 사용자가 자동으로 생성하지 않고 변경됩니다. 물론 유일한 해결책은 데이터베이스에 고유 키를 넣는 것이지만 DDD의 원칙은 아닙니다. 단일 개체의 유효성을 검사하는 데 사용되는 사양 패턴을 보았습니다. 그 패턴은 Car 객체 세트에 어떻게 적용될 것입니까?

사양 클래스 (CheckUniqueCarSpecification이라고 부름)가 ICarRepository에 액세스하는 것이 합법적입니까?

+2

이 질문을보십시오. http://stackoverflow.com/questions/5818898/where-to-put-global-rules-validation-in-ddd –

+0

감사합니다. 그것은 아마도 대답 일 것입니다 - 저장소에 대한 액세스 권한이있는 사양입니다. –

답변

1

저장소는 메모리 내 모음을 모방합니다. 내가 전에 사용했던 것은 Find 메쏘드와 반대로 Contains 메쏘드 일 뿐이다. 쿼리 계층도이 용도로 사용할 수 있습니다. CarRepository과 마찬가지로 CarQuery 일 수 있습니다. 도메인의 독창성을 검사하는 것은 다소 성가신 일입니다. 나는 편의를 위해서 검사를 할 것이지만 여전히 DB를 사용하여 예외를 발생시킨다. 왜냐하면 당신은 또한 그 사건을 다루어야하기 때문이다. 이것에 대한 명세 패턴을 사용하는 것은 가치가있는 것보다 더 많은 노력이 필요할 수 있습니다.

리포지토리가 '콜렉션'이므로 CommitRollback이 없습니다.

+0

내 잘못입니다. 실제로 커밋과 롤백은 다른 인터페이스 (작업 단위)에 있습니다. 내가 고칠거야. –

0

DomainService ICarCodesLibrary를 사용하십시오.

public class Car { 
    ctor(string someUniqueCode, ICarCodesLibrary codes) 
    { 
    // the check 
    codes.IsValidCode(someUniqueCode) 
    } 
    public int Id {get;private set;} 
    public string SomeUniqueCode {get;private set;} 
} 

Car 객체를 생성하고 삽입하는 곳에 인터페이스를 구현하십시오. 또한 속성을 제거하고 필드를 사용하십시오. 신분증은 소품 이어도 괜찮습니다.

관련 문제