В чем разница между картографом данных, шлюзом табличных данных (Gateway), объектом доступа к данным (DAO) и шаблонами репозитория?
-
03-07-2019 - |
Вопрос
Я пытаюсь освежить свои навыки разработки шаблонов, и мне любопытно, в чем различия между этими шаблонами?Все они кажутся одним и тем же - инкапсулируют логику базы данных для определенного объекта, поэтому вызывающий код не знает о базовом уровне сохраняемости.Из моего краткого исследования следует, что все они обычно реализуют ваши стандартные методы 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 (и каждый из них на самом деле вовсе не является чем-то новым и уникальным, но опять же:новые названия для уже известных концепций, собранные в одной книге).Поэтому я не говорю, что все эти современные парадигмы и сокращения означают ОДНО и то же, но вы действительно не должны быть слишком параноидальными по этому поводу.В основном это одни и те же модели, просто из разных семей.
Средство сопоставления данных против Шлюза табличных данных Короче говоря, это долгая история:
В конце концов, оба они будут выступать в качестве посредника между объектами в памяти и базой данных.
Ты верно подметил.Выберите тот, который вам больше всего знаком.Я хотел бы указать на несколько вещей, которые могут помочь прояснить ситуацию.
Шлюз табличных данных используется в основном для одной таблицы или представления.Он содержит все операции выбора, вставки, обновления и удаления.Итак, Клиент - это таблица или представление в вашем случае.Итак, один экземпляр объекта шлюза табличных данных обрабатывает все строки в таблице.Обычно это связано с одним объектом для каждой таблицы базы данных.
В то время как 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.Это отделяет источник данных от модели предметной области.