Génération d’identités pour des entités dans DDD

modifier

Pour clarifier davantage mon problème initial, j’ai réécrit la question avec plus de termes ‘DDD’, de modèles communs et d’arguments de discussion. La version originale peut être trouvée sous révisions .


Où et comment les identités d’ entités / racines d’ agrégat sont-elles générées dans le domaine lors de l’application correcte de DDD?

Je dois atsortingbuer des identités uniques à mes entités, que ce soit lors de leur création ou de leur persistance. Ces identités peuvent se présenter sous plusieurs styles

  • Calculé (basé sur les caractéristiques d’une entité, donc sur les besoins de l’entreprise)
  • Natural (basé sur un certain ensemble de règles, donc basé sur une logique métier)
  • Les substituts (basés sur des valeurs générées aléatoirement sans signification commerciale)

Il existe de nombreuses approches pour la tâche de génération et d’atsortingbution d’identités, depuis l’utilisation d’ usines pour créer des identités, la délégation à l’infrastructure via ORM ou la génération de bases de données, etc. vous ne voulez pas de modèles de domaine anémique et d’ injection de services dans des entités ?

Exigences telles que déclarées ci-dessus

  • Aucun modèle de domaine anémique
  • Aucune dependency injection des services dans les entités

Approches possibles

  • Des usines
  • Double dispatch ( cela peut-il être utilisé pour la génération d’identité? )
  • Génération à l’intérieur des repositorys
  • Génération à l’intérieur d’une infrastructure (par exemple ORM ou firebase database)
  • Services d’injection dans des entités

Je le placerais dans une usine. Générer un identifiant ne devrait pas faire partie de la logique de domaine, à mon avis, car c’est vraiment une question d’infrastructure. Vous pouvez prendre id de DB ou le générer avec uuid ou autre. C’est un détail Rappelez-vous également que seule l’interface d’une fabrique appartient à la couche de domaine, pas sa mise en œuvre.

À propos de vos doutes pour l’usine, si vous utilisez l’usine pour créer des entités, vous devriez l’utiliser partout. C’est comme ça que je le fais.

Vaughn Vernon, auteur de Implementing Domain Driven Design, préconise la création d’identifiants uniques dans des référentiels comme celui-ci:

  public TenantId nextIdentity() { return new TenantId(UUID.randomUUID().toSsortingng().toUpperCase()); } 

TenantId est un object de valeur qui encapsule l’identité de l’entité.