거의 모든 상황에서 기본 키는 비즈니스 도메인의 일부가 아닙니다. 물론, 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로 갈 때 메모리 내 임시 식별자를 도입하여,