Aquí hay un pequeño problema
Tener una entidad, con un objeto de valor. No es un problema. Reemplazo un objeto de valor por uno nuevo, luego nhibernate inserta el nuevo valor y deja huérfano al antiguo, luego lo elimina. Ok, eso es un problema
Asegurado es mi entidad en mi dominio. Tiene una colección de direcciones (objetos de valor). Una de las direcciones es MailingAddress. Cuando queremos actualizar la dirección de correo, digamos que el código postal era incorrecto, siguiendo la doctrina del Sr. Evans, debemos reemplazar el objeto antiguo por uno nuevo ya que es inmutable (¿un objeto de valor correcto?).
Pero no queremos eliminar la fila, porque la PK de esa dirección es un FK en una tabla MailingHistory. Entonces, siguiendo la doctrina del Sr. Evans, estamos bastante jodidos aquí. A menos que haga mis Entidades de direcciones, así que no tengo que "reemplazarlo", y simplemente actualizar su miembro de código postal, como en los viejos tiempos.
¿Qué me sugerirías en este caso? A mi modo de ver, ValueObjects solo son útiles cuando desea encapsular un grupo de columnas de la tabla de la base de datos (componente en nhibernate). Todo lo que tenga una identificación de persistencia en la base de datos, es mejor convertirlo en una Entidad (no necesariamente una raíz agregada) para que pueda actualizar sus miembros sin recrear todo el gráfico del objeto, especialmente si es un objeto anidado profundamente.
¿Está de acuerdo? ¿Está permitido por el Sr. Evans tener un objeto de valor mutable? ¿O es un objeto de valor mutable un candidato para una Entidad?
Gracias
fuente
Respuestas:
Todo lo que tiene una identidad debe ser una Entidad, y todo lo que no tiene una identidad es un valor simple, por lo tanto, un objeto de valor.
Para citar a Martin Fowler (que a su vez le pregunta a Eric Evans)
Motivo para hacer de su dirección un Objeto de valor:
Si su dirección es mutable, probablemente arruinará su historial de correo al final. Por ejemplo, si está enviando artículos a un cliente, no puede estar seguro de a qué dirección envió realmente algo en el pasado si la dirección a la que se refiere su tabla MailingHistory ha cambiado.
La entrada de MailingHistory Enviamos A764 a la dirección 657 podría significar que enviamos el artículo A764 a Boston ayer y enviamos el artículo A764 a Nueva York mañana.
Si se debe cambiar la dirección de correo, no es necesario eliminar la anterior. Guárdelo y márquelo como inactivo , y el nuevo como activo .
Por supuesto, podría tratar su dirección como una Entidad, pero solo al actualizarla no cambiaría el lugar real al que se refiere la dirección, por lo tanto, solo permitirá la corrección de errores tipográficos.
Si está seguro de que podría asegurarse de eso, sería posible usar una Entidad.
Pero la mejor solución en mi humilde opinión es no hacer referencia a una entidad de dirección en su historial de correo, sino guardar la dirección específica directamente en su tabla de historial de correo (básicamente copiando los datos de la dirección).
De esta manera, siempre sabrá dónde envió sus cosas (o lo que sea que esté enviando), y dado que usaría una Entidad mutable, su tabla de direcciones no estará abarrotada.
He trabajado con / en varios sistemas ERP, y casi todos utilizaron este enfoque.
Tendrá algo de redundancia en su base de datos, pero es la forma más pragmática en mi humilde opinión.
fuente
ALTER
, puede ser necesario usar entidades en tablas separadas. Eso, a su vez, requiere estrategias como "unirse siempre a la dirección / teléfono / correo electrónico más reciente " en susSELECT
consultas, que son difíciles de mantener mantenibles y eficientes. Mantenlo simple, si es posible.active
bandera. Por supuesto, debe asegurarse de usar siempreand active = true
en sus Uniones, mantener actualizado el indicador y agregar una restricción a su tabla para que, por ejemplo, solo un correo electrónico para cada cliente pueda tener este indicador establecido en verdadero.active=true
. Esto no es lo que yo llamaría simple, que es exactamente por qué me gusta su solución.Veo 2 cosas:
¿Está bien que el cambio de código postal afecte un registro de historial? Creo que sería lógico que el registro del historial apunte a la dirección anterior sin cambios, para que sepa que la envía a una dirección incorrecta.
En el momento en que MailingHistory tiene FK en la dirección, la dirección dejó de ser un objeto de valor y se convirtió en una entidad. Los objetos de valor no tienen identidad, lo que permite que otras entidades hagan referencia a esta identidad. Puede tener direcciones en una sola tabla con otras tablas apuntando a ella, pero el único efecto es ahorrar espacio. Desde el punto de vista del dominio, si dos entidades tienen el mismo tipo de objeto de valor de referencia, entonces no comparten ningún tipo de información.
fuente
OMI, el objeto de dirección es una entidad en su dominio. Es compartido por múltiples entidades, tiene su propia identidad y es único en todo el sistema.
Evans dice:
fuente