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

StackOverflow https://stackoverflow.com/questions/804751

Вопрос

Я пытаюсь освежить свои навыки разработки шаблонов, и мне любопытно, в чем различия между этими шаблонами?Все они кажутся одним и тем же - инкапсулируют логику базы данных для определенного объекта, поэтому вызывающий код не знает о базовом уровне сохраняемости.Из моего краткого исследования следует, что все они обычно реализуют ваши стандартные методы 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);

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

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

Это было полезно?

Решение

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

A Хранилище "действует как коллекция, за исключением более сложных возможностей запроса". [Эванс, Доменно-ориентированный дизайн] и может рассматриваться как "объекты в фасаде памяти" (Обсуждение репозитория)

A Преобразователь данных "перемещает данные между объектами и базой данных, сохраняя их независимыми друг от друга и от самого картографа" (Фаулер, PoEAA, Картограф)

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

A ДАО "отделяет клиентский интерфейс ресурса данных от его механизмов доступа к данным / адаптирует API доступа к конкретному ресурсу данных к общему клиентскому интерфейсу" позволяя "механизмы доступа к данным изменяются независимо от кода, который использует данные" (Чертежи Солнца)

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

Другие советы

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

Средство сопоставления данных против Шлюза табличных данных Короче говоря, это долгая история:

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

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

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

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

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

    Итак, обычно в mapper вы видите такие методы, как insert, update, delete, а в table data gateway вы найдете getcustomerbyId, getcustomerbyName и т.д.

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

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

    Ниже приведено только мое понимание.

    Табличный вход/RowDataGateWay:В этом контексте Gateway ссылается на конкретную реализацию, в которой каждый "объект домена" сопоставлен каждому "шлюзу объекта домена".Например, если у нас есть Человек, тогда у нас будет Личный вход сохранить доменный объект Person в базе данных.Если у нас есть Person, Employee, Customer и т.д., у нас будут PersonGateway, EmployeeGateway и CustomerGateway.Каждый шлюз будет иметь определенную функцию CRUD для этого объекта, и это не имеет никакого отношения к другому шлюзу.Здесь нет повторно используемого кода / модуля.Шлюз может быть дополнительно разделен на RowDataGateway или TableGateway, в зависимости от того, передаете ли вы "идентификатор" или "объект".Шлюз обычно сравнивается с активной записью.Он привязывает вашу модель домена к схеме базы данных.

    Репозиторий/DataMapper/DAO:Это одно и то же.Все они относятся к уровню сохраняемости, который переносит объекты базы данных в модель предметной области.В отличие от gateway, Репозиторий / DataMapper / DAO скрывает реализацию.Вы не знаете, есть ли PersonGateway за Person.Может быть, так, а может, и нет, вам все равно.Все, что вы знаете, это то, что для каждого объекта домена должны поддерживаться операции CRUD.Это отделяет источник данных от модели предметной области.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top