Sto cercando di rispolverare le mie abilità nel design pattern e sono curioso di sapere quali sono le differenze tra questi pattern? Tutti sembrano essere la stessa cosa: incapsulare la logica del database per un'entità specifica, quindi il codice chiamante non ha conoscenza del livello di persistenza sottostante. Dalla mia breve ricerca in genere tutti implementano i metodi CRUD standard e sottraggono i dettagli specifici del database.
Oltre alle convenzioni di denominazione (ad es. CustomerMapper vs. CustomerDAO vs. CustomerGateway vs. CustomerRepository), qual è la differenza, se presente? Se c'è una differenza, quando sceglieresti l'uno rispetto all'altro?
In passato avrei scritto un codice simile al seguente (semplificato, naturalmente - normalmente non avrei usato proprietà pubbliche):
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);
}
e hanno una CustomerGateway
classe che implementa la logica specifica del database per tutti i metodi. A volte non userei un'interfaccia e rendere statici tutti i metodi su CustomerGateway (lo so, lo so, lo rende meno testabile) in modo da poterlo chiamare come:
Customer cust = CustomerGateway.GetCustomerByID(42);
Questo sembra essere lo stesso principio per i pattern Data Mapper e Repository; il modello DAO (che è la stessa cosa di Gateway, penso?) sembra incoraggiare anche gateway specifici del database.
Mi sto perdendo qualcosa? Sembra un po 'strano avere 3-4 modi diversi di fare la stessa cosa esatta.