Estoy trabajando con Doctrine2 por primera vez, pero creo que esta pregunta es lo suficientemente genérica como para no depender de un ORM específico.Usando el patrón del asignador de datos, ¿deberían las entidades (objetos de dominio) conocer al asignador?
caso de que las entidades en un modelo de datos Mapper ser consciente - y uso - la Mapper?
Tengo algunos ejemplos específicos, pero todos parecen reducirse a la misma pregunta general.
Si estoy tratando con datos de una fuente externa - por ejemplo, un User
tiene muchas Messages
- y la fuente externa simplemente proporciona las pocas entidades (como una fuente RSS), ¿cómo puede $user->addMessage($message)
comprobación de duplicados a menos que sea es consciente del Mapper, o 'busca' a través de la colección (parece una tarea ineficiente).
Por supuesto, un controlador o secuencia de comandos de transacción podría verificar si hay duplicados antes de agregar el mensaje al usuario, pero eso no parece del todo correcto y conduciría a la duplicación del código.
Si tengo una gran colección - de nuevo un User
con muchas Messages
- ¿cómo puede la entidad User
proporcionar la limitación y la paginación para la recogida sin tener que hacer proxy a una llamada Mapper?
Una vez más, el controlador o Transacción de secuencias de comandos o lo está utilizando la entidad podría utilizar el asignador directamente para recuperar una colección de la User
's Messages
limitados en número, rango de fechas, u otros factores - pero eso también daría lugar a código duplicación.
¿Es la respuesta usando Repositorios y haciendo que la Entidad sea consciente de ellos? (Al menos para Doctrine2, y cualquier concepto análogo utilizado por otros ORM). En ese punto, la entidad aún está relativamente desacoplada de Mapper.
Sí, estoy con usted en los patrones de diseño, y recorrer todos los mensajes es la solución simple, pero eso significa (asumiendo una gran cantidad de mensajes) que está cargando todos los registros del almacenamiento cuando una simple consulta daría el mismo resultado. –
Sí, por eso mencioné posiblemente el uso de la función doesUserHaveMessage (o algo similar). Eso podría ser donde se realiza la consulta. Aún mantiene sus entidades limpias y enfocadas, pero le permite mantener su dominio constante. Además, puede comenzar con una implementación simple/trivial (loop through array), pero luego refactorizar más tarde cuando el rendimiento lo requiera ... siempre y cuando su interfaz permanezca igual, ningún otro código tiene que cambiar. – jsuggs