2009-03-24 14 views
43

Realmente no he visto ningún ejemplo, pero supongo que se guardan dentro de la tabla de entidades que contienen dentro de la base de datos.¿Cómo se almacenan los objetos de valor en la base de datos?

Ie. Si tengo una entidad Persona/raíz agregada y una tabla Persona correspondiente, si tuviera un Objeto de valor llamado Dirección, los valores de Dirección se guardarían dentro de esta tabla Persona.

¿Tiene sentido para un dominio donde tengo otras entidades, como empresas, etc. que tienen una dirección?

(Actualmente estoy escribiendo una aplicación de gestión de proyectos y tratando de entrar en DDD)

Respuesta

84

Está bien para guardar objetos de valor en una tabla separada, por las mismas razones que he descrito. Sin embargo, creo que estás entendiendo mal las Entidades frente a los VO: no es una preocupación relacionada con la persistencia.

He aquí un ejemplo:

Supongamos que una empresa y persona ambos tienen el mismo correo Dirección. ¿Cuál de estas afirmaciones considera válida?

  1. "Si modifico Company.Address, quiero Person.Address para obtener automáticamente esos cambios"
  2. "Si modifico Company.Address, se debe no afecta Person.Address"

Si es cierto, Dirección debe ser una entidad , y por lo tanto tiene su o wn mesa

Si es cierto, Dirección debe ser un valor de los objetos. Se podría almacenar como un componente dentro de la tabla de la Entidad padre, o podría tener su propia tabla (una mejor normalización de la base de datos).

Como puede ver, la forma en que se persiste la dirección no tiene nada que ver con la semántica Entidad/VO.

7

La mayoría de los desarrolladores tienden a pensar primero en la base de datos antes que nada. DDD no sabe cómo se maneja la persistencia. Eso depende del repositorio para lidiar con eso. Puede persistir como un archivo xml, sql, de texto, etc. etc. Las entidades/agregados/objetos de valor son conceptos relacionados con el dominio.

La explicación de Vijay Patel es perfecta.

2

Comencé a aprender DDD con el libro Eric Evans y el excelente proyecto dddsample Cargo como ejemplo. http://dddsample.sourceforge.net/

Así que para aquellos (como yo) que quiere materializar la diferencia en la implementación del código de este matiz en la capa de modelo de dominio, diría:

El método overidded iguala o/y sameIdentityAs/SameValueAs (de la interfaz Entity y ValueObject) son, creo, el lugar de su expresión.

Es sólo mi sentimiento :)

creo interesante para leer esto también:

http://martinfowler.com/bliki/ValueObject.html

Cuestiones relacionadas