2012-12-29 1 views
2

예제 응용 프로그램에서 접근 방식으로 데이터베이스 을 먼저 수행하고 있습니다. POCO 클래스는 t4 템플릿을 통해 생성되며 데이터베이스에서 전달하는 Identity 속성을 갖습니다. 도메인에서 엔티티로 사용하는 일부 클래스의 경우 int, string & Guid 일 수 있습니다.DDD에서 저장소와의 동일성 충돌

도메인에서 생성하여 저장소에 전달할 수있는 문자열 또는 GUID에 문제가있는 것을 볼 수 없습니다. int의 경우에도 그렇게 할 수는 있지만AUTOINCREMENT 옵션을 활용하고 싶습니다.

내 질문은 :

  1. 누구의 책임은 법인의 신원을 생성하는 것입니다. 도메인 또는 저장소입니까?

  2. 리포지토리와 도메인간에 신원을 동기화하는 방법은 무엇입니까? 예를 들어 도메인에 고객에 대해 1000이라는 ID를 생성하고 저장소에 저장하도록 요청할 수 있습니다. 저장소가 저장하면 새 ID는 2000 일 수 있습니다 (AUTOINCREMENT 옵션은 새 ID를 설정합니다). 이제는 두 엔티티가 다르며 도메인의 Customer 엔티티 (Department 등)가 다른 엔티티와 함께 ​​사용되면 도메인에 문제가 발생할 수 있습니다. ID가 1000 인 도메인의 캐시 된 엔터티 (고객)는 SQL 데이터 스토어의 새 엔터티로 저장됩니다. 리포지토리는 고객이 캐시되었는지 또는 새 고객인지 여부를 알지 못합니다.

답변

2

누구의 책임은 법인의 신원을 생성하는 것입니다. 도메인 또는 리포지토리가 입니까?

엔티티의 신원은 도메인에 의해 직접 또는 클라이언트 요청을 통해 할당 될 수 있습니다. 이 ID 유형은 대개 Guid 또는 보편적으로 고유 한 다른 값으로 생성됩니다. ID는 증 분식 ID C 럼과 같은 데이터베이스 생성 ID를 반영하기 위해 저장소에 의해 지정 될 수도 있습니다.

리포지토리와 도메인간에 신원 정보를 동기화하는 방법은 무엇입니까?

엔터티의 ID가 데이터베이스 생성 ID 열의 원본 인 경우 도메인에서 자체 ID를 할당하면 안됩니다. 통합 ID를 가진 임시 엔티티는 초기에 식별 값 0을 갖습니다. 일시적 엔티티가 지속되면 저장소는 ID 값을 할당합니다. 이 시점에서 신원 값이 변경된 이후 새로 영구적 인 엔티티 인스턴스의 캐시 된 인스턴스에 몇 가지 문제가있을 수 있음을 지적합니다. 이러한 문제를 해결할 수있는 몇 가지 방법이 있지만 처음 장소의 캐시 (또는 다른 곳)에서 일시적인 항목을 참조하지 않도록합니다. 엔티티가 영속화 될 때까지 여러 위치에서 엔티티가 참조되지 않도록함으로써보다 쉽게 ​​수행 할 수 있습니다. 여러 위치에서 일시적인 엔터티 인스턴스를 참조하도록 끝내면 .NET 런타임 ID가 인스턴스 수명 기간 동안 동일하게 유지되는지 확인할 수 있습니다.이렇게하려면 ID 값 확인 전에 object.ReferenceEquals을 통해 항목을 비교해야하며 객체 수명 기간 동안 GetHashCode을 통해 생성 된 해시 코드를 캐시해야합니다.

+0

첫 번째 대답에 대해 의견을 말하면 사용자가 "나는 각 문자를 식별 할 수 있도록 긴 문자의 임의의 문자를 사용하고 싶습니다."라는 문제 도메인이 발생하지 않았습니다. 내 요점은 Guids가 도메인에 정의 될 필요가 없다는 것입니다. 여러 서버에서 동기화가 필요하거나 이와 같은 특성이있는 경우이를 처리하는 인프라 개체에서 도메인 엔터티를 래핑하는 것이 좋습니다. 그러나 두 번째 질문에 대한 답은 소품입니다. 아주 잘 말했다. 나는 그것을 upvote 것이다. –

+0

사용자는 일반적으로 ID를 전혀 신경 쓰지 않고 Guid에 대한 좋은 점은 호출 클라이언트가 제공 할 수있는 경우에 해당하는 경우 서버의 ID를 알기 위해 서버에서 응답을 기다릴 필요가 없다는 것입니다 생성 된 엔티티 이는 CQRS 시나리오에서 유용합니다. 또 다른 이점은 서버에서 ID를 제공하는 경우 ID를 알기 위해 데이터베이스 응답을 기다릴 필요가 없다는 것입니다. 어느 쪽이든, ID는 기술적 인 문제입니다. – eulerfx

+0

본인의 ID가 기술적 인 문제이므로 귀하의 유비쿼터스 언어를 따르지 않는 ID로 귀하의 도메인 모델 (기술적 인 문제와 관련이 없어야 함)을 오염시키는 이유는 무엇입니까? 이 두 가지 예는 불필요한 스모그없이 쉽게 해결할 수 있습니다. –