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