Ich versuche, meine Fähigkeiten als Designmuster aufzufrischen, und ich bin gespannt, was die Unterschiede zwischen diesen Mustern sind. Alle scheinen dasselbe zu sein - kapseln Sie die Datenbanklogik für eine bestimmte Entität, sodass der aufrufende Code keine Kenntnis von der zugrunde liegenden Persistenzschicht hat. Nach meiner kurzen Recherche implementieren alle normalerweise Ihre Standard-CRUD-Methoden und abstrahieren die datenbankspezifischen Details.
Was ist der Unterschied, abgesehen von Namenskonventionen (z. B. CustomerMapper vs. CustomerDAO vs. CustomerGateway vs. CustomerRepository)? Wenn es einen Unterschied gibt, wann würden Sie einen über den anderen wählen?
In der Vergangenheit habe ich Code ähnlich dem folgenden geschrieben (natürlich vereinfacht - ich würde normalerweise keine öffentlichen Eigenschaften verwenden):
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);
}
und haben eine CustomerGateway
Klasse, die die spezifische Datenbanklogik für alle Methoden implementiert. Manchmal habe ich keine Schnittstelle verwendet und alle Methoden auf dem CustomerGateway statisch gemacht (ich weiß, ich weiß, das macht es weniger testbar), damit ich es so nennen kann:
Customer cust = CustomerGateway.GetCustomerByID(42);
Dies scheint das gleiche Prinzip für die Data Mapper- und Repository-Muster zu sein. Das DAO-Muster (das ist, glaube ich, dasselbe wie Gateway?) scheint auch datenbankspezifische Gateways zu fördern.
Vermisse ich etwas Es scheint ein bisschen seltsam, 3-4 verschiedene Möglichkeiten zu haben, genau dasselbe zu tun.