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