oop - first - factory pattern
¿Cómo difiere el patrón de repositorio de una capa de acceso a datos simple? (2)
En general, estoy de acuerdo con las declaraciones del autor, pero me gustaría agregar algunos detalles
Diferencia entre Repository y DAL / ORM que primero no solo abstrae el mecanismo de persistencia, sino que también proporciona una interfaz tipo colección para acceder a los objetos de dominio ... y aísla los objetos de dominio de los detalles del código de acceso a la base de datos :
Diferencias
Para capas externas, como Business Logic:
- Ayuda a evitar la abstracción con fugas . Las capas externas dependen de la abstracción del Repositorio , en lugar de una implementación específica de DAL / ORM . De este modo, podría evitar toda la infraestructura y las dependencias lógicas al trabajar con Repository .
- opera con objetos de dominio , en lugar de instancias de POJO / POCO / DTO
- Las operaciones CRUD se aplicaron a la interfaz tipo colección proporcionada por Repository , en lugar de los métodos específicos DAL / ORM . Por ejemplo, .net : trabajando con colección que implementa
IEnumerable
, en lugar entity-framework contexto de entity-framework o sesión de nhibernate
Similitudes
El repositorio contiene DAL / ORM debajo y sirve el mismo propósito
Me he sentido confundido por lo que he estado leyendo durante mi investigación sobre el patrón del repositorio. Me pregunto si la gente está (incorrectamente) usando esa palabra cuando simplemente se refieren a una capa de acceso a datos.
Como "repositorio" no se encuentra en el índice de Patrones de diseño (GoF), he recurrido a Patrones de arquitectura de aplicaciones empresariales (Fowler). Fowler parece bastante claro (página 323) cuando afirma que los clientes crean un objeto de criterio y lo pasan al repositorio para obtener los resultados. Se ve algo como esto:
public class Person
{
public List<Person> Dependents()
{
Repository repository = Registry.personRepository();
Criteria criteria = new Criteria();
criteria.equal(Person.BENEFACTOR, this);
return repository.matching(criteria);
}
}
¿Es el objeto de criterio lo que hace que el repositorio sea un repositorio? Si no, ¿qué hace? Si el objetivo es abstraer el mecanismo de persistencia (y, por lo tanto, construir consultas), de qué manera difiere el repositorio de una llamada DAL / ORM simpe como esta:
public class PersonLogic
{
public List<Person> GetDependents()
{
IPersonData personData = DependencyContainer.Resolve<IPersonData>();
return personData.GetDependents();
}
}
Para mí, la diferencia es así:
* Con el patrón de repositorio, el cliente construye diferentes objetos de criterio y llama al método Matching () en él.
* Con el DAL simple, los clientes solo llaman a diferentes métodos según lo que quieran.
¿Hay algo más que esto? ¿Los programadores usan erróneamente el término "repositorio" cuando realmente quieren decir DAL?
EDITAR
David Osborne envió este enlace a Persistence Patterns . Afirma:
Básicamente, el patrón Repositorio solo significa colocar una fachada sobre su sistema de persistencia para que pueda proteger el resto del código de su aplicación de tener que saber cómo funciona la persistencia.
Eso es realmente lo que es una capa de acceso a datos. Realmente me parece que un repositorio y un DAL son la misma cosa, y tal vez un repositorio "verdadero" utiliza el objeto de criterios.
Consulte la sección "Uso de la interfaz IQueryable" y más adelante en Extensión y mejora del contexto limitado de pedidos y registros . Proporciona una discusión perspicaz y equilibrada de las implementaciones de DAO / repositorio.
Como posteriormente resaltó Bob Horn, los artículos de Persistence Patterns resumen que:
Básicamente, el patrón Repositorio solo significa colocar una fachada sobre su sistema de persistencia para que pueda proteger el resto del código de su aplicación de tener que saber cómo funciona la persistencia.