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

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

Ответы на вопрос(5)

Ваш ответ на вопрос