Tôi đã khám phá BDD/DDD và kết quả là cố gắng đưa ra cách triển khai đúng mô hình Repository. Cho đến nay, thật khó để tìm thấy một sự đồng thuận về cách tốt nhất để thực hiện điều này. Tôi đã cố gắng để đun sôi nó xuống các biến thể sau đây, nhưng tôi không chắc chắn đó là cách tiếp cận tốt nhất.Cách tốt nhất để triển khai Mẫu Kho lưu trữ là gì?
Để tham khảo, tôi đang xây dựng một ứng dụng ASP.MVC với NHibernate làm giao diện người dùng.
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);
}
những suy nghĩ ban đầu của tôi là rằng
1) là rất lớn từ một điểm hiệu quả của xem, nhưng tôi có thể nhận được vào rắc rối khi mọi thứ trở nên phức tạp hơn.
2) có vẻ rất tẻ nhạt và có thể kết thúc với một lớp học rất đông đúc, nhưng nói cách khác cung cấp mức độ tách biệt cao giữa logic miền và lớp dữ liệu mà tôi thích.
3) có vẻ khó khăn ở phía trước và nhiều công việc hơn để viết truy vấn, nhưng giới hạn ô nhiễm chéo chỉ với lớp Thông số.
4) Yêu cầu ít nhất của tôi, nhưng có thể trực tiếp nhất và có thể là hiệu quả nhất cho các truy vấn phức tạp, mặc dù nó đặt rất nhiều trách nhiệm về mã gọi.
+1 cho câu hỏi kịp thời. Tôi cũng đã vật lộn với mẫu Repository. – TrueWill
Có lẽ không phải những gì bạn đang tìm kiếm, nhưng tôi thấy việc triển khai mẫu Spec này thực sự tuyệt vời: http://mathgeekcoder.blogspot.com/2008/07/advanced-domain-model-queries-using.html. Chủ yếu là vì nó cho phép bạn sử dụng Linq2Sql/Linq2NHibernate/etc. –
Cảm ơn TrueWill và cảm ơn Martinho, điều đó thực sự liên quan rất tốt đến một chủ đề khác mà tôi đã đăng gần đây http: // stackoverflow.com/questions/1408553/đặc điểm kỹ thuật-pattern-vs-spec-in-bdd –