Pregunta

Tengo un objeto de dominio utilizado en un mapa de identidad (las claves son la propiedad Id del objeto).

Pseudocódigo:

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

Observo el objeto que me dice cuando se ha guardado en la base de datos:

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

Para los objetos nuevos, el campo Id está vacío y no se llena hasta que se guarda en la base de datos.

Y ahí radica mi problema. En el caso de nuevos objetos, la búsqueda " map [domainObj.Id] " falla porque la identidad del objeto ha cambiado después de ser guardado

¿Cuál es la mejor manera de usar un objeto en un mapa de identidad como este?

Restricciones :

  1. Estoy usando un lenguaje que no permite objetos como claves en una asignación [JavaScript]
  2. El campo Id debe generarse en el servidor al guardar un nuevo objeto

Update

Gracias por los comentarios. Realmente me gustaría tener objetos de valor asignados de la misma manera que las entidades: solo porque el objeto de valor no se haya guardado no significa que no tenga un valor para asignar a mi aplicación. De hecho, no entiendo bien qué es un mapa de identidad (que, después de volver a leer la definición del patrón, resulta que realmente no estoy usando).

La solución que se me ocurrió es bastante directa de la respuesta de Igor: cada objeto recibe una identificación aleatoria asignada al crear una instancia. Es único, inmutable e inmutable durante la vida del contexto en el que vive el objeto. Está allí para ambas entidades de la base de datos y nuevas instancias. El ajuste para las entidades es que está configurado para que coincida con la identidad real del objeto. Esto hace que la depuración sea un poco más fácil. Este es el valor que uso como clave en la asignación.

¿Fue útil?

Solución

Hasta que un objeto obtenga la identidad, es solo un objeto de valor . Solo después de que se haya establecido la identidad, se convierte en una entidad .

Hasta que el objeto se convierta en una entidad, realmente no puede colocarlo en un mapa de identidad como el suyo, no tiene sentido, ya que no puede extraerlo (ya que no tiene una clave única para encontrarlo).

Un enfoque posible:

  1. Agregue una bandera a la clase que indique el estado del objeto (nuevo / guardado).
  2. Implementar una identificación temporal (del lado del cliente) para estos objetos
  3. Opcional:
    1. mantener " nuevo " objetos en un mapa de identidad separado (si no puede evitar conflictos de ID entre ID de cliente y servidor)
    2. mantener " nuevo " objetos en el mismo mapa de identidad (si puede evitar conflictos de ID entre ID de cliente y servidor)
  4. Una vez que se ha guardado el objeto, reemplace la ID del cliente con la ID del servidor, configure el estado como guardado, vaya al mapa de identidad principal (si es necesario).

Vea aquí sobre las entidades versus objetos de valor

Otros consejos

Bueno, tendrá que encontrar una manera de posponer la adición del objeto al mapa hasta que después de se haya guardado y se le haya asignado un ID.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top