В чем разница между Data Mapper, Table Data Gateway (Gateway), объектами доступа к данным (DAO) и шаблонами репозитория?

Я пытаюсь разобраться в своих навыках дизайна шаблона, и мне любопытно, каковы различия между этими шаблонами? Все они кажутся одинаковыми - инкапсулируйте логику базы данных для конкретной сущности, чтобы вызывающий код не знал о лежащем в основе уровне сохранения. Из моего краткого исследования все они обычно реализуют ваши стандартные методы CRUD и абстрагируют детали, специфичные для базы данных.

Помимо соглашений об именах (например, CustomerMapper и CustomerDAO против CustomerGateway против CustomerRepository), в чем разница, если таковая имеется? Если есть разница, когда вы выбрали один над другим?

В прошлом я бы написал код, похожий на следующий (упрощенный, естественно - я обычно не использовал бы общедоступные свойства):

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);
}

и имеет класс CustomerGateway, который реализует конкретную логику базы данных для всех методов. Иногда я не использовал интерфейс и не делал все методы на статике CustomerGateway (я знаю, что я знаю, что делает его менее проверяемым), поэтому я могу назвать его так:

Customer cust = CustomerGateway.GetCustomerByID(42);

Это похоже на тот же принцип для шаблонов Data Mapper и Repository; по-видимому, шаблон DAO (что то же самое, что и Gateway)?), по-видимому, поощряет шлюзы, специфичные для конкретной базы данных.

Я что-то упустил? Кажется немного странным иметь 3-4 разных способа сделать то же самое.

Ответ 1

Ваши примерные условия; DataMapper, DAO, DataTableGateway и репозиторий имеют сходную цель (когда я использую один, я ожидаю вернуть объект Customer), но разные намерения/смысл и результирующая реализация.

A Репозиторий "действует как коллекция, за исключением более сложных запросов" [Evans, Domain Driven Design ] и могут рассматриваться как "объекты в фазе памяти" (Обсуждение репозитория)

A DataMapper "перемещает данные между объектами и базой данных, сохраняя их независимо друг от друга и самого транслятора" (Fowler, PoEAA, Mapper)

A TableDataGateway - это "Шлюз" (объект, который инкапсулирует доступ к внешней системе или ресурсу) в таблицу базы данных. Один экземпляр обрабатывает все строки в таблице "( Fowler, PoEAA, TableDataGateway)

A DAO "отделяет клиентский интерфейс ресурса данных от своих механизмов доступа к данным/адаптирует конкретный API доступа к ресурсам к универсальному клиентскому интерфейсу, позволяя" механизмам доступа к данным изменять независимо от кода, который использует данные "( Sun Blueprints)

Репозиторий кажется очень общим, не вызывая представления о взаимодействии с базой данных. DAO предоставляет интерфейс, позволяющий использовать различные базовые реализации баз данных. TableDataGateway представляет собой тонкую оболочку вокруг одной таблицы. DataMapper действует как посредник, позволяющий объекту модели эволюционировать независимо от представления базы данных (с течением времени).

Ответ 2

В мире разработки программного обеспечения есть тенденция (по крайней мере, я так считаю) придумывать новые имена для известных старых вещей и моделей. И когда у нас есть новая парадигма (которая, возможно, немного отличается от уже существующих вещей), она обычно поставляется с целым набором новых имен для каждого уровня. Таким образом, "Business Logic" становится "Service Layer" только потому, что мы говорим, что мы делаем SOA, а DAO становится репозиторием только потому, что мы говорим, что делаем DDD (и каждый из них на самом деле не является чем-то новым и уникальным вообще, но опять же: новые имена для уже известных понятий, собранных в той же книге). Поэтому я не говорю, что все эти современные парадигмы и акронимы означают ТОЧНО одно и то же, но вы действительно не должны быть слишком параноидальными. В основном это одни и те же шаблоны, только из разных семей.

Ответ 3

Data Mapper vs Table Data Gateway Короче говоря:

Data Mapper получит объект Domain Model (Entity) в качестве параметра и будет использовать его для реализации операций CRUD Шлюз данных таблицы получит все параметры (как примитивы) для методов и ничего не узнает о объекте Domain Model (Entity).

В конце концов, оба они будут выступать в качестве посредника между объектами в памяти и базой данных.

Ответ 4

У вас есть хороший момент. Выберите тот, с которым вы больше всего знакомы. Я хотел бы указать несколько вещей, которые могут помочь прояснить.

Шлюз данных таблицы используется в основном для отдельной таблицы или представления. Он содержит все выборки, вставки, обновления и удаления. Таким образом, Клиент - это таблица или представление в вашем случае. Таким образом, один экземпляр объекта шлюза данных таблицы обрабатывает все строки в таблице. Обычно это связано с одним объектом в таблице базы данных.

В то время как Data Mapper более независим от любой логики домена и менее связан (хотя я считаю, что есть связь или нет связи). Это просто промежуточный уровень для передачи данных между объектами и базой данных, сохраняя их независимо друг от друга и самого транслятора.

Итак, как правило, в mapper вы видите такие методы, как вставка, обновление, удаление, а в шлюзе данных таблицы вы найдете getcustomerbyId, getcustomerbyName и т.д.

Объект передачи данных отличается от двух вышеуказанных шаблонов, главным образом потому, что это шаблон распределения, а не шаблон источника данных, как указано выше в двух шаблонах. Используйте его, главным образом, когда вы работаете с удаленным интерфейсом, и вам нужно сделать ваши звонки менее разговорчивыми, поскольку каждый звонок может стать дорогим. Поэтому обычно разрабатывайте DTO, который может быть сериализован через провод, который может переносить все данные обратно на сервер для применения дальнейших бизнес-правил или обработки.

Я не очень разбираюсь в шаблоне репозитория, поскольку до сих пор у меня не было возможности использовать его, но я буду смотреть на другие ответы.