거의 모든 상황에서 기본 키는 비즈니스 도메인의 일부가 아닙니다. 물론, UserName사용자 또는 OrderNumber주문에 대해 고유 한 인덱스를 가진 중요한 사용자 대면 객체가 있을 수 있지만 대부분의 경우 도메인 객체를 단일 값 또는 값 세트로 누구에게나 명백하게 식별 할 필요 가 없습니다 . 관리 사용자. 이러한 예외적 인 경우에도, 특히 GUID (Global Unique Identifier) 를 사용하는 경우 기본 키 자체를 노출하는 대신 대체 키를 사용하거나 사용하려고합니다.
따라서 도메인 기반 디자인에 대한 나의 이해가 정확하다면 기본 키 는 노출 될 필요가 없으며 따라서 잘 찢어 져야합니다 . 그들은 추악하고 내 스타일을 경련. 그러나 도메인 모델에 기본 키를 포함하지 않으면 다음과 같은 결과가 발생합니다.
- 기본적 으로 도메인 모델 조합에서만 파생되는 DTO (데이터 전송 개체) 에는 기본 키가 없습니다.
- 들어오는 DTO에는 기본 키가 없습니다.
따라서 실제로 순수하게 유지하고 도메인 모델에서 기본 키를 제거하려는 경우 해당 기본 키의 고유 한 인덱스로 모든 요청을 처리 할 수 있도록 준비해야한다고 말하는 것이 안전합니까?
다시 말해서, 다음 중 어떤 솔루션이 도메인 모델에서 PK를 제거한 후 특정 객체를 식별하는 올바른 접근 방법입니까?
- 다른 속성으로 처리해야하는 객체를 식별 할 수 있음
- DTO에서 기본 키를 다시 가져옵니다. 즉, 지속성에서 도메인으로 매핑 할 때 PK를 제거한 다음 도메인에서 DTO로 매핑 할 때 PK를 다시 결합합니까?
편집 :이 구체적으로 만들어 봅시다.
내 도메인 모델은 말 VoIPProvider과 같은 필드를 포함 Name, Description, URL, 참고 문헌이 좋아뿐만 아니라 ProviderType, PhysicalAddress등을 Transactions.
이제 권한있는 사용자가 관리 할 수있는 웹 서비스를 만들고 싶다고 가정 해 보겠습니다 VoIPProvider.
이 경우 사용자에게 친숙한 ID는 쓸모가 없습니다. 결국 VoIP 제공 업체는 이름이 컴퓨터와 구별되는 경향이 있고 사업상의 이유로 인간의 의미와는 구별되는 경향이있는 회사입니다. 따라서 VoIPProvider고유가에 의해 완전히 결정 되었다고 말하는 것으로 충분할 수 있습니다 (Name, URL). 이제 PUT api/providers/voip권한있는 사용자가 VoIP공급자 를 업데이트 할 수 있는 방법 이 필요하다고 가정하겠습니다 . 을 (를) 전송합니다. VoIPProviderDTO여기에는 VoIPProvider잠재적으로 일부 평탄화를 포함하여 의 모든 필드를 포함하지만 전부는 아닙니다 . 그러나, 나는 그들의 마음을 읽을 수 없으며, 여전히 우리가 어떤 제공자에 관해 이야기하고 있는지 말해야합니다.
2 (아마도 3) 옵션이있는 것 같습니다.
- 내 도메인 모델에 기본 키 또는 대체 키를 포함시켜 DTO로 보내거나 그 반대로
- 다음과 같은 고유 색인을 통해 관심있는 제공자를 식별하십시오.
(Name, Url) - 지속성 계층에 대한 구현 세부 사항을 노출하지 않는 방식으로 지속성 계층, 도메인 및 DTO 사이에 항상 맵핑 할 수있는 일종의 중간 오브젝트를 도입하십시오 (예 : 도메인에서 DTO로 갈 때 메모리 내 임시 식별자를 도입하여,