Em quase todas as circunstâncias, as chaves primárias não fazem parte do seu domínio comercial. Claro, você pode ter alguns objetos importantes voltados para o usuário com índices exclusivos ( UserName
para usuários ou OrderNumber
pedidos), mas na maioria dos casos, não há necessidade comercial de identificar abertamente objetos de domínio por um único valor ou conjunto de valores, para qualquer pessoa, exceto talvez um usuário administrativo. Mesmo nesses casos excepcionais, especialmente se você estiver usando identificadores exclusivos globais (GUID) , você gostará ou desejará empregar uma chave alternativa em vez de expor a própria chave primária.
Portanto, se minha compreensão do design orientado a domínio é precisa, as chaves primárias não precisam e, portanto , não devem ser expostas, e uma boa viagem. Eles são feios e cãibras no meu estilo. Mas se optarmos por não incluir chaves primárias no modelo de domínio, haverá consequências:
- Ingenuamente, objetos de transferência de dados (DTO) derivados exclusivamente de combinações de modelos de domínio não terão chaves primárias
- Os DTOs recebidos não terão uma chave primária
Portanto, é seguro dizer que, se você realmente permanecer puro e eliminar as chaves primárias no seu modelo de domínio, deverá estar preparado para lidar com todas as solicitações em termos de índices exclusivos nessa chave primária?
Em outras palavras, qual das seguintes soluções é a abordagem correta para lidar com a identificação de objetos específicos após remover a PK em modelos de domínio?
- Ser capaz de identificar os objetos com os quais você precisa lidar com outros atributos
- Recuperando a chave primária no DTO; ou seja, eliminando a PK ao mapear da persistência para o domínio e recombinando a PK ao mapear do domínio para o DTO?
EDIT: Vamos tornar isso concreto.
Diga meu modelo de domínio é VoIPProvider
o que inclui campos como Name
, Description
, URL
, bem como referências gosto ProviderType
, PhysicalAddress
e Transactions
.
Agora, digamos que eu queira criar um serviço da Web que permita que usuários privilegiados gerenciem VoIPProvider
s.
Talvez um ID amigável ao usuário seja inútil nesse caso; afinal, os provedores de VoIP são empresas cujos nomes tendem a ser distintos no sentido do computador e até distintos o suficiente no sentido humano por razões comerciais. Portanto, basta dizer que um único VoIPProvider
é completamente determinado por (Name, URL)
. Então agora vamos dizer que preciso de um método PUT api/providers/voip
para que usuários privilegiados possam atualizar os VoIP
provedores. Eles enviam um VoIPProviderDTO
, que inclui muitos, mas não todos os campos do VoIPProvider
, incluindo alguns achatamentos potencialmente. No entanto, não consigo ler a mente deles, e eles ainda precisam me dizer de qual provedor estamos falando.
Parece que tenho 2 (talvez 3) opções:
- Inclua uma chave primária ou alternativa no meu modelo de domínio e envie-a para o DTO e vice-versa
- Identifique o provedor com o qual nos preocupamos por meio do índice exclusivo, como
(Name, Url)
- Introduzir algum tipo de objeto intermediário que sempre possa mapear entre a camada de persistência, domínio e DTO de uma maneira que não exponha os detalhes da implementação sobre a camada de persistência - digamos, introduzindo um identificador temporário na memória ao passar do domínio para o DTO e vice-versa,