Я изучал BDD/DDD и, как следствие, пытался придумать правильную реализацию шаблона репозитория. До сих пор было трудно найти консенсус относительно наилучшего способа реализации этого. Я попытался свести его до следующих вариантов, но я не уверен, что это лучший подход.
Для справки Я создаю приложение ASP.MVC с NHibernate как фоновый.
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);
}
Мои первоначальные мысли заключаются в том, что
1) отлично с точки зрения эффективности, но я могу столкнуться с проблемами, поскольку ситуация усложняется.
2) кажется очень утомительным и может закончиться очень переполненным классом, но в противном случае предлагает высокую степень разделения между моей логикой домена и уровнем данных, который мне нравится.
3) кажется сложным фронтом и больше работы для написания запросов, но ограничивает перекрестное загрязнение только уровнем Specs.
4) Моя наименее любимая, но, возможно, самая прямая реализация и, возможно, большинство баз данных для сложных запросов, хотя она несет большую ответственность за код вызова.