J'ai été d'explorer BDD/DDD et comme une conséquence essayer de venir avec une bonne mise en œuvre du modèle de Référentiel. Jusqu'à présent, il a été difficile de trouver un consensus sur la meilleure façon de le mettre en œuvre. J'ai essayé de la faire bouillir pour la suite de variations, mais je n'en suis pas sûr quelle est la meilleure approche.
Pour référence, je suis en train de construire un ASP.Application MVC avec NHibernate comme un back-end.
public interface IRepository<T> {
// 1) Thin facade over LINQ
T GetById(int id);
void Add(T entity);
void Update(T entity);
void Remove(T entity);
IQueryable<T> Find();
// or possibly even
T Get(Expression<Func<T, bool>> query);
List<T> Find(Expression<Func<T, bool>> query);
}
public interface IRepository<T> {
// 2) Custom methods for each query
T GetById(int id);
void Add(T entity);
void Update(T entity);
void Remove(T entity);
IList<T> FindAll();
IList<T> FindBySku(string sku);
IList<T> FindByName(string name);
IList<T> FindByPrice(decimal price);
// ... and so on
}
public interface IRepository<T> {
// 3) Wrap NHibernate Criteria in Spec pattern
void Add(T entity);
void Update(T entity);
void Remove(T entity);
IList<T> FindAll();
IList<T> FindBySpec(ISpecification<T> specification);
T GetById(int id);
}
public interface IRepository<T> {
// 4) Expose NHibernate Criteria directly
T GetById(int id);
void Add(T entity);
void Update(T entity);
void Remove(T entity);
IList<T> FindAll();
IList<T> Find(ICriteria criteria);
// .. or possibly
IList<T> Find(HQL stuff);
}
Mes premières pensées sont que
1) est grande à partir d'un point de vue, mais je peut avoir des ennuis comme les choses deviennent plus compliquées.
2) semble très fastidieux et pourrait se retrouver avec un très encombré de la classe, mais sinon, il offre un haut degré de séparation entre mon domaine de la logique et de la couche de données que j'aime.
3) semble difficile à l'avant et plus de travail pour écrire des requêtes, mais les limites de la contamination croisée juste les Spécifications de la couche.
4) j'ai le moins aimé, mais peut-être la plus directe de mise en œuvre et, éventuellement, la plupart de la base de données efficace pour les requêtes complexes, mais elle met beaucoup de responsabilité sur le code appelant.