Ich habe BDD/DDD untersucht und als Konsequenz versucht, eine korrekte Implementierung des Repository-Musters zu finden. Bisher war es schwierig, einen Konsens darüber zu finden, wie dies am besten umgesetzt werden kann. Ich habe versucht, es auf die folgenden Variationen herunterzukochen, aber ich bin mir nicht sicher, welches der beste Ansatz ist.Die beste Methode zum Implementieren von Repository Pattern?
Als Referenz erstellen ich eine ASP.MVC-Anwendung mit NHibernate als 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);
}
Meine ersten Gedanken sind, dass
1) aus einem Wirkungsgrad Sicht ist groß, aber ich kann in Schwierigkeiten geraten, wie die Dinge komplizierter.
2) scheint sehr langweilig und könnte mit einer sehr überfüllten Klasse enden, bietet aber ansonsten einen hohen Grad an Trennung zwischen meiner Domänenlogik und Datenschicht, die ich mag.
3) scheint im Voraus schwierig und mehr Arbeit, um Abfragen zu schreiben, sondern grenzt Kreuzkontamination auf nur die Specs-Ebene.
4) Meine am wenigsten bevorzugten, aber möglicherweise direkteste Implementierung und möglicherweise die meisten Datenbank effizient für komplexe Abfragen, obwohl es eine große Verantwortung für den aufrufenden Code.
+1 für eine rechtzeitige Frage. Ich habe auch mit dem Repository-Muster gekämpft. – TrueWill
Wahrscheinlich nicht das, wonach Sie suchen, aber ich fand diese Implementierung des Spec-Musters wirklich cool: http://mathgeekcoder.blogspot.com/2008/07/advanced-domain-model-queries-using.html. Vor allem, weil Sie damit Linq2Sql/Linq2NHibernate/etc. –
Danke TrueWill und danke Martinho, das bezieht sich eigentlich sehr gut auf ein anderes Thema, das ich kürzlich http: // stackoverflow veröffentlicht habe.com/questions/1408553/Spezifikation-Muster-vs-spec-in-bdd –