¿Cuál es la diferencia entre el Mapeador de datos, la Puerta de Enlace de Datos de tabla (Gateway), el Objeto de Acceso a datos (DAO) y los patrones de Repositorio?


Estoy tratando de repasar mis habilidades de patrón de diseño, y tengo curiosidad ¿cuáles son las diferencias entre estos patrones? Todos ellos parecen ser la misma cosa: encapsular la lógica de la base de datos para una entidad específica para que el código de llamada no tenga conocimiento de la capa de persistencia subyacente. A partir de mi breve investigación, todos ellos generalmente implementan sus métodos CRUD estándar y abstraen los detalles específicos de la base de datos.

Aparte de las convenciones de nomenclatura (por ejemplo, CustomerMapper vs CustomerDAO vs CustomerGateway vs CustomerRepository), ¿cuál es la diferencia, si la hay? Si hay una diferencia, ¿cuándo elegirías uno sobre el otro?

En el pasado escribía código similar al siguiente (simplificado, naturalmente-normalmente no usaría propiedades públicas):

public class Customer
{
    public long ID;
    public string FirstName;
    public string LastName;
    public string CompanyName;
}

public interface ICustomerGateway
{
    IList<Customer> GetAll();
    Customer GetCustomerByID(long id);
    bool AddNewCustomer(Customer customer);
    bool UpdateCustomer(Customer customer);
    bool DeleteCustomer(long id);
}

Y tienen una clase CustomerGateway que implementa la lógica de base de datos específica para todos los métodos. A veces no usaría una interfaz y haría todos los métodos en el CustomerGateway estática (sé, sé, que lo hace menos comprobable) por lo que puedo llamarlo como:

Customer cust = CustomerGateway.GetCustomerByID(42);

Este parece ser el mismo principio para los patrones de Mapeador de datos y Repositorio; el patrón DAO (que es lo mismo que Gateway, creo?) también parece fomentar las pasarelas específicas de las bases de datos.

¿Me estoy perdiendo algo? Parece un poco raro tener 3-4 maneras diferentes de hacer exactamente lo mismo.

Author: TylerH, 2009-04-30

5 answers

Sus términos de ejemplo; DataMapper, DAO, DataTableGateway y Repository, todos tienen un propósito similar (cuando uso uno, espero recuperar un objeto Cliente), pero diferente intención/significado y la implementación resultante.

Un Repositorio "actúa como una colección, excepto con una capacidad de consulta más elaborada" [Evans, Domain Driven Design ] y puede ser considerado como un "objetos en fachada de memoria" (Discusión del repositorio )

A DataMapper "mueve datos entre objetos y una base de datos mientras los mantiene independientes entre sí y del propio mapeador" (Fowler, PoEAA, Mapper)

A TableDataGateway es "una puerta de enlace (objeto que encapsula el acceso a un sistema o recurso externo) a una tabla de base de datos. Una instancia maneja todas las filas de la tabla" (Fowler, PoEAA, TableDataGateway)

A DAO "separa el cliente de un recurso de datos interfaz desde sus mecanismos de acceso a datos / adapta la API de acceso de un recurso de datos específico a una interfaz de cliente genérica " permitiendo que "los mecanismos de acceso a datos cambien independientemente del código que usa los datos" (Planos solares )

El repositorio parece muy genérico, sin exponer ninguna noción de interacción con la base de datos. Un DAO proporciona una interfaz que permite utilizar diferentes implementaciones de bases de datos subyacentes. Un TableDataGateway es específicamente una envoltura delgada alrededor de un mesa individual. Un DataMapper actúa como intermediario permitiendo que el objeto Modelo evolucione independientemente de la representación de la base de datos (con el tiempo).

 93
Author: Pierce Hickey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-25 18:08:12

Hay una tendencia en el mundo del diseño de software (al menos, me parece) a inventar nuevos nombres para cosas y patrones antiguos conocidos. Y cuando tenemos un nuevo paradigma (que quizás difiere ligeramente de las cosas ya existentes), generalmente viene con un conjunto completo de nombres nuevos para cada nivel. Así que "Lógica de negocios " se convierte en" Capa de servicios " solo porque decimos que hacemos SOA, y DAO se convierte en Repositorio solo porque decimos que hacemos DDD (y cada uno de ellos no es realmente algo nuevo y único en absoluto, pero de nuevo: nuevos nombres para conceptos ya conocidos reunidos en el mismo libro). Así que no estoy diciendo que todos estos paradigmas modernos y acrónimos significan EXACTAMENTE lo mismo, pero realmente no deberías ser demasiado paranoico al respecto. En su mayoría, estos son los mismos patrones, solo que de diferentes familias.

 25
Author: Dmitry Perets,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-30 18:12:51

Data Mapper vs Table Data Gateway Para hacer una larga historia corta:

  • el Mapeador de datos recibirá el objeto del Modelo de Dominio (Entidad) como param y lo utilizará para implementar las operaciones CRUD
  • la Puerta de enlace de Datos de tabla recibirá todos los parámetros(como primitivos) para los métodos y no sabrá nada sobre el objeto del Modelo de Dominio(Entidad).

    Al final ambos actuarán como mediadores entre los objetos en memoria y la base de datos.

  •  22
    Author: danidacar,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
    2017-06-07 00:54:34

    Tienes un buen punto. Elige el que más te resulte familiar. Me gusta señalar algunas cosas que pueden ayudar a aclarar.

    La puerta de enlace de datos de tabla se utiliza principalmente para una sola tabla o vista. Contiene todas las selecciones, inserciones, actualizaciones y eliminaciones. Así que el cliente es una tabla o una vista en su caso. Por lo tanto, una instancia de un objeto table data gateway maneja todas las filas de la tabla. Por lo general, esto está relacionado con un objeto por tabla de base de datos.

    Mientras que el Mapeador de datos es más independiente de cualquier lógica de dominio y está menos acoplado (aunque creo que hay acoplamiento o no acoplamiento). Es simplemente una capa intermedia para transferir los datos entre objetos y una base de datos mientras los mantiene independientes entre sí y del mapeador en sí.

    Por lo tanto, normalmente en un mapeador, verá métodos como insert, update, delete y en table data gateway encontrará getcustomerbyId, getcustomerbyName, etc.

    El objeto de transferencia de datos difiere de los dos patrones anteriores, principalmente porque es un patrón de distribución y no un patrón de fuente de datos como los dos patrones anteriores. Úselo principalmente cuando está trabajando con una interfaz remota y necesita hacer que sus llamadas sean menos habladas, ya que cada llamada puede ser costosa. Por lo general, diseñe un DTO que pueda ser serializado a través de un cable que pueda llevar todos los datos al servidor para aplicar reglas de negocio o procesamiento adicionales.

    No estoy bien versado en el patrón del repositorio, ya que no tuve la oportunidad de usarlo hasta ahora, pero estaré mirando otros responden.

     15
    Author: Srikar Doddi,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
    2009-04-30 00:03:33

    A continuación es solo mi comprensión.

    TableGateway / RowDataGateWay: En este contexto, Gateway hace referencia a una implementación específica que tiene cada" objeto de dominio "mapeado a cada"objeto de dominio gateway". Por ejemplo, si tenemos Person , entonces tendremos un PersonGateway para almacenar el objeto de dominio Person en la base de datos. Si tenemos Persona, Empleado, cliente, etc., tendremos PersonGateway, EmployeeGateway y CustomerGateway. Cada puerta de enlace tendrá función CRUD específica para ese objeto y no tiene nada que ver con otra puerta de enlace. No hay código/módulo reutilizable aquí. La puerta de enlace se puede dividir en RowDataGateway o TableGateway, depende de si pasa un "id"o un "objeto". Gateway se suele comparar con Active record. Vincula su modelo de dominio al esquema de base de datos.

    Repository / DataMapper / DAO : Son la misma cosa. Todos se refieren a la capa de persistencia que transfiere entidades de base de datos al modelo de dominio. A diferencia de gateway, el Repositorio / DataMapper / DAO oculta la implementación. No sabes si hay una persona detrás de la Persona. Puede, o puede no, no te importa. Todo lo que sabe es que debe tener operaciones CRUD soportadas para cada objeto de dominio. Desacopla la fuente de datos y el modelo de dominio.

     0
    Author: Hao Lu,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
    2018-04-13 18:49:24