我正在將一些公共存儲庫基礎結構合併到某些包裝EF,L2SQL和WCF數據服務的應用程序中(儘管基礎數據訪問實現應該是任意的)。我已經對此事進行了一些閱讀,但似乎無法找到真正滿足的例子。通用存儲庫
我開始:
public interface IRepository : IDisposable
{
IQueryable<T> Query<T>();
void Attach(object entity);
void ForDeletion(object entity);
void SaveChanges();
}
但我喜歡用窄域合同(http://codebetter.com/blogs/gregyoung/archive/2009/01/16/ddd-the-generic-repository.aspx)存儲庫的想法。以上內容讓消費者知道存儲庫支持的所有實體類型。
我不會說這是不可能的,但我很難確信IQueryables本身不應該是存儲庫合同的一部分。我不是鍋爐板代碼的粉絲,我堅信你擁有的越多,引入的維護黑洞就越多。所以,我要說的是,這將是很難說服我,任何看起來像:
Public IEnumerable<Customer> GetCustomersWithFirstNameOf(string _Name) {
internalGenericRepository.FetchByQueryObject(new CustomerFirstNameOfQuery(_Name)); //could be hql or whatever
}
是什麼,但一個完全糟糕想法。當你想要搜索名字和姓氏時怎麼辦?或者名字或姓氏等等。您最終將擁有一個擁有超過1000個操作的存儲庫,其中一半重複相同的邏輯。注:我不是調用代碼應該是負責應用的所有過濾和這樣的,而是具有互補的規範源對我來說很有意義:
public static class CustomerSpecifications
{
public IQueryable<Customer> WithActiveSubscriptions(this IQueryable<Customer> customers, DateTime? start, DateTime? end)
{
// expression manipulation
return customers;
}
}
// bind some data source
repository.GetQueryable().WithActiveSubscriptions();
好了,往前走,我認爲有域模型明確倉庫聽起來像一個好主意,按以下格式:
public interface IRepository : IDisposable
{
void SaveChanges();
}
public interface IRepository<T>: IRepository
{
IQueryable<T> GetQueryable();
void Attach(T entity);
void ForDeletion(T entity);
}
然後
public class CustomerRepository:IRepository<Customer>
{
private ObjectContext _context;
// trivial implementation
}
,但我的這個問題是,它只是讓我DELET e客戶。那麼我想刪除客戶地址的情況呢?也就是說,我使用存儲庫來查詢客戶實體,但是然後想要刪除myCustomer.CustomerAddresses [0]?我需要創建第二個存儲庫來簡單地附加和刪除我想要的地址?
我想我可以有我的CustomerRepository是:
public class CustomerRepository:IRepository<Customer>, IRepository<CustomerAddress>
{
private ObjectContext _context;
// trivial implementation
}
這將讓我重新使用存儲庫中刪除CustomerAddresses,但我不知道我的感覺如何繼承IRepository<T>
對於圖形的每一個部分我想要公開刪除...
public class CustomerRepository:IRepository<Customer>, IRepository<CustomerAddress> /* this list may get pretty long, and then I really just have a masked EF ObjectContext, don't I? */
{
任何人都有更好的實施建議嗎?
因此,您對每個聚合根擁有GenericRepository ...因爲在CustomerAddress中沒有GenericRepository? –
Jeff
2010-11-29 00:52:29