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