Dans presque toutes les circonstances, les clés primaires ne font pas partie de votre domaine d'activité. Bien sûr, vous pouvez avoir des objets importants pour l'utilisateur avec des indices uniques ( UserName
pour les utilisateurs ou OrderNumber
pour les commandes) mais dans la plupart des cas, il n'est pas nécessaire pour les entreprises d'identifier ouvertement les objets de domaine par une seule valeur ou un ensemble de valeurs, pour quiconque, mais peut-être un utilisateur administratif. Même dans ces cas exceptionnels, en particulier si vous utilisez des identificateurs uniques globaux (GUID) , vous aimerez ou voudrez utiliser une clé alternative plutôt que d'exposer la clé primaire elle-même.
Donc, si ma compréhension de la conception basée sur le domaine est précise, les clés primaires n'ont pas besoin et ne doivent donc pas être exposées, et un bon débarras. Ils sont moches et étouffent mon style. Mais si nous choisissons de ne pas inclure les clés primaires dans le modèle de domaine, il y a des conséquences:
- Naïvement, les objets de transfert de données (DTO) qui dérivent exclusivement de combinaisons de modèles de domaine n'auront pas de clés primaires
- Les DTO entrants n'auront pas de clé primaire
Donc, est-il sûr de dire que si vous voulez vraiment rester pur et éliminer les clés primaires dans votre modèle de domaine, vous devez être prêt à pouvoir traiter chaque demande en termes d'index uniques sur cette clé primaire?
Autrement dit, laquelle des solutions suivantes est la bonne approche pour traiter l'identification d'objets particuliers après la suppression de PK dans les modèles de domaine?
- Être capable d'identifier les objets dont vous avez besoin pour traiter avec d'autres attributs
- Récupérer la clé primaire dans le DTO; c'est-à-dire, l'élimination du PK lors du mappage de la persistance au domaine, puis la recombinaison du PK lors du mappage du domaine au DTO?
EDIT: Rendons cela concret.
Dites mon modèle de domaine est VoIPProvider
qui comprend des domaines tels que Name
, Description
, URL
, ainsi que des références aiment ProviderType
, PhysicalAddress
et Transactions
.
Supposons maintenant que je souhaite créer un service Web qui permettra aux utilisateurs privilégiés de gérer le VoIPProvider
s.
Peut-être qu'un identifiant convivial est inutile dans ce cas; après tout, les fournisseurs de VoIP sont des entreprises dont les noms ont tendance à être distincts au sens informatique et même assez distincts au sens humain pour des raisons commerciales. Il suffit donc de dire qu'un unique VoIPProvider
est complètement déterminé par (Name, URL)
. Alors maintenant, disons que j'ai besoin d'une méthode PUT api/providers/voip
pour que les utilisateurs privilégiés puissent mettre à jour les VoIP
fournisseurs. Ils envoient un VoIPProviderDTO
, qui inclut de nombreux champs de la VoIPProvider
, mais pas tous , y compris un certain aplatissement potentiel. Cependant, je ne peux pas lire dans leurs pensées et ils ont encore besoin de me dire de quel fournisseur nous parlons.
Il semble que j'ai 2 (peut-être 3) options:
- Inclure une clé primaire ou une clé alternative dans mon modèle de domaine et l'envoyer au DTO, et vice versa
- Identifiez le fournisseur qui nous intéresse via l'index unique, comme
(Name, Url)
- Introduisez une sorte d'objet intermédiaire qui peut toujours mapper entre la couche de persistance, le domaine et le DTO d'une manière qui n'expose pas les détails d'implémentation de la couche de persistance - par exemple en introduisant un identifiant temporaire en mémoire lors du passage du domaine au DTO et vice-versa,