Question

J'ai un objet de domaine utilisé dans une carte d'identité (les clés sont la propriété Id de l'objet).

Pseudocode:

map = new Mapping();
map[domainObj.Id] = 'foo';

J'observe l'objet pour me dire quand il a été enregistré dans la base de données:

domainObj.bind('saved', function() {
    map[domainObj.Id] = 'new foo!'
})

Pour les nouveaux objets, le champ Id est vide et non renseigné tant qu'il n'est pas enregistré dans la base de données.

Et c'est là que réside mon problème. Dans le cas de nouveaux objets, la recherche " < map [domainObj.Id] " échoue car l'identité de l'objet a changé après son enregistrement!

Quel est le meilleur moyen d'utiliser un objet dans une carte d'identité de ce type?

Contraintes :

  1. J'utilise un langage qui n'autorise pas les objets comme clés dans un mappage [JavaScript]
  2. Le champ Id doit être généré sur le serveur lors de l'enregistrement d'un nouvel objet

Mettre à jour

Merci pour les commentaires. J'aimerais vraiment que les objets de valeur soient mappés de la même manière que les entités: ce n'est pas parce que l'objet de valeur n'a pas été enregistré qu'il ne dispose pas d'une valeur à mapper pour mon application. En fait, je ne comprends pas ce qu'est une carte d'identité (qui, après avoir relu la définition du motif, il s'avère que je ne l'utilise pas vraiment).

La solution que j’ai suggérée est assez directe de la réponse d’Igor: chaque objet se voit attribuer un identifiant aléatoire lors de l’instanciation. Il est unique, immuable et immuable pendant la durée de vie du contexte dans lequel l’objet vit. Il est là pour les deux entités de la base de données et de nouvelles instanciations. Le tweak pour les entités est qu'il est configuré pour correspondre à la véritable identité de l'objet. Cela facilite un peu le débogage. C’est la valeur que j’utilise comme clé dans le mappage.

Était-ce utile?

La solution

Jusqu'à ce qu'un objet obtienne l'identité, il ne s'agit que d'un objet de valeur . Une fois l’identité établie, elle devient une entité .

Tant que l'objet ne devient pas une entité, vous ne pouvez pas vraiment le placer dans une carte d'identité comme la votre - cela n'a aucun sens, car vous ne pouvez pas le retirer (car vous ne disposez pas d'une clé unique pour le trouver).

Une approche possible:

  1. Ajouter un indicateur à la classe qui indique l’état de l’objet (nouveau / enregistré).
  2. Implémentez un ID temporaire (côté client) pour ces objets
  3. Facultatif:
    1. garder " new " Objets d'une mappe d'identité séparée (si vous ne pouvez pas éviter les conflits d'ID entre les identifiants client et serveur)
    2. garder " new " Objets figurant dans la carte identique (si vous pouvez éviter les conflits d'ID entre les identifiants client et serveur)
  4. Une fois l'objet enregistré, remplacez l'ID client par l'ID du serveur, définissez l'état sur enregistré, accédez à la carte d'identité principale (si nécessaire).

Voir ici à propos des objets vs objets de valeur

Autres conseils

Eh bien, vous devrez trouver un moyen de différer l'ajout de l'objet à la carte jusqu'à ce que après celui-ci ait été enregistré et doté d'un identifiant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top