J'essaie de rafraîchir mes compétences en matière de conception de modèles, et je suis curieux de savoir quelles sont les différences entre ces modèles? Tous semblent être la même chose - encapsuler la logique de la base de données pour une entité spécifique afin que le code appelant n'ait aucune connaissance de la couche de persistance sous-jacente. De ma brève recherche, tous implémentent généralement vos méthodes CRUD standard et résument les détails spécifiques à la base de données.
Outre les conventions de dénomination (par exemple, CustomerMapper vs CustomerDAO vs CustomerGateway vs CustomerRepository), quelle est la différence, le cas échéant? S'il y a une différence, quand choisiriez-vous l'un plutôt que l'autre?
Dans le passé, j'écrivais un code similaire au suivant (simplifié, naturellement - je n'utiliserais normalement pas de propriétés publiques):
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);
}
et avoir une CustomerGateway
classe qui implémente la logique de base de données spécifique pour toutes les méthodes. Parfois, je n'utiliserais pas une interface et je ne rendrais pas toutes les méthodes de CustomerGateway statiques (je sais, je sais, cela le rend moins testable) afin que je puisse l'appeler comme:
Customer cust = CustomerGateway.GetCustomerByID(42);
Cela semble être le même principe pour les modèles Data Mapper et Repository; le modèle DAO (qui est la même chose que Gateway, je pense?) semble également encourager les passerelles spécifiques aux bases de données.
Est-ce que je manque quelque chose? Cela semble un peu étrange d'avoir 3-4 façons différentes de faire exactement la même chose.