Patrón de repositorio frente a entidades administradoras de DAO


10

Soy nuevo en conceptos como DAO, DAL y Domain Driven Design. Al final, quiero desacoplar la capa de persistencia (base de datos mysql) de mis objetos de negocio y lógica en una aplicación web. Me gustó el concepto DAO, pero me quedé atascado al implementarlo cuando quiero crear un objeto comercial a partir de una base de datos que tenga otras entidades asociadas (representadas por una clave externa en la tabla db).

  1. ¿Cómo se manejan estas referencias (agregaciones) usando el patrón DAO? Cada ejemplo de DAO en línea es simple y muestra la creación de Business Objects similares a objetos de valor únicamente (sin hacer referencia a otras entidades u objetos de valor). ¿Se hace usando la Inyección de dependencias y, de ser así, dónde se crea la dependencia?
  2. Al seguir leyendo , supongo que el patrón de Repositorio de DDD ofrece la posibilidad de usar DAO detrás de escena y manejar agregaciones de objetos. Según tengo entendido, solo proporciona la llamada raíz (Entidad con todas las referencias cargadas o cargadas perezosas) al mundo exterior, lo que me parece un buen enfoque. ¿Se recomienda el repositorio cuando se utiliza DAO? ¿Pueden los DAO mismos proporcionar esta funcionalidad manteniendo la ignorancia de persistencia en los Business Objects?

No estoy usando una herramienta ORM y no quiero, ya que me gusta explorar estos patrones básicos directamente



Sry, pensé que esta pregunta es más adecuada aquí. Lo elimino en stackoverflow.
Michbeckable

¿Qué marco de lenguaje estás usando? si quieres ejemplos concretos ... también deberías buscar cosas de Martin Fawler sobre el tema.
AK_


Patterns of Enterprise Architecture tiene una gran sección sobre patrones de acceso a datos. Si no recuerdo mal, el Gateway de datos de tabla de Fowler es análogo a un DAO, por lo que muchos de los patrones que describe en el libro se han implementado en bibliotecas ORM.
Mike Partridge

Respuestas:


4

Hay dos preocupaciones con las que lidiar, que son ortogonales entre sí:

1) El extremo inferior de la persistencia

Esto es donde usted tiene que tratar con Conexiones , Consultas , ResultSets y similares. Por lo general, usa uno u otro marco que le da un patrón de fachada a mano, que abstrae las cosas sucias para que solo sepa qué quiere saber (conjunto de resultados de la consulta) y dónde podría encontrarlo el marco ( Consulta y conexión). Lo que hagas con el conjunto de resultados depende de ti.

Cuando su paradigma es OOP, hay un paso adicional involucrado: ensamblar el conjunto de resultados en objetos. O lo haces manualmente o tienes un correlacionador de objetos que hace el trabajo por ti.

2) La abstracción dentro de su aplicación Encima de esta capa de bajo nivel se encuentra la abstracción con la que trata su aplicación. Existe el DataAccessObject (DAO) -Layer o el Repository -Layer. Ambos generan objetos para que su aplicación funcione.

Cuál está usando no tiene ningún efecto en la respuesta de su pregunta.

Su pregunta es, por un lado, sobre el modelado ( »Cómo manejar las relaciones entre objetos« Respuesta: a través de Composición / Agregación ) y sobre cómo llenar el objeto (y sus dependencias) con datos.

¿Se hace usando la Inyección de dependencias y, de ser así, dónde se crea la dependencia?

Este es el camino a seguir. Hay dos maneras:

1) Hace explícita la DI y define un constructor. Al crear el Objeto, primero puede crear todas las dependencias e inyectarlas mediante la inyección del constructor o del setter

2) Usas un marco, que hace la magia por ti. A menudo la reflexión está involucrada, es decir, hay posibilidades en algunos idiomas para examinar y manipular objetos sobre la marcha. La inyección se realiza de forma transparente para el usuario por el marco.

Esto es independiente del patrón DAO / Repository.

No estoy usando una herramienta ORM y no quiero, ya que me gusta explorar estos patrones básicos directamente

Ese es un enfoque noble, pero no en todos los casos productivo. La mayoría de las veces, quieres hacer cosas. Con fines educativos, podría seguir ese camino. Pero no lo recomendaría.

Busque un marco ORM flexible, que le ayude cuando sea necesario sin obligarlo de una forma u otra. No en todos los casos es efectiva la consulta generada por ootB. Un buen marco le permite usar SQL cuando sea necesario y solo se ocupa de la parte de ensamblaje .


1

Aquí es donde ORM (mapeo relacional de objetos) es útil. Hay bibliotecas para muchos lenguajes de programación que proporcionan este tipo de técnicas de programación. Por ejemplo, para Java hay Hibernate . Hibernate funciona con anotaciones Java. Aquí hay un ejemplo simple para una relación de muchos a uno de la documentación oficial :

@Entity
public class Flight implements Serializable {
    @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name="COMP_ID")
    public Company getCompany() {
        return company;
    }
    ...
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.