我想弄清楚如何使用新的EF代碼優先的東西,我很難找出如何適應Include
功能到一個半通用的存儲庫類。 (我說半泛型,因爲類不是泛型的,只是方法,所以我有一個倉庫,它包裝了一個聚合體,本質上,你可以與所有屬於該聚合體的實體進行交互,而不僅僅是一個實體。 )包含在(半)通用庫
我的情況是我已經有一個孩子要加載總是需求,然後是僅可選加載其他的孩子,我想包括我的資源庫方法的簡單的布爾參數的實體。像這樣:
public S GetByID<S>(int entityID, bool loadChildren = false) where S : class
{
DbSet<S> set = _context.Set<S>();
if (loadChildren)
set = FullInclude<S>(set);
else
set = DefaultInclude<S>(set);
return set.Find(entityID);
}
protected virtual DbSet<S> DefaultInclude<S>(DbSet<S> set) where S : class
{
// base implementation just returns the set
// derived versions would attach Includes to the set before returning it
return set;
}
protected virtual DbSet<S> FullInclude<S>(DbSet<S> set) where S : class
{
// base implementation just returns the set
// derived versions would attach Includes to the set before returning it
return set;
}
這是我的基地倉庫,我希望能夠覆蓋在派生類中那些XyzInclude
方法。但是我需要用一個非泛型實現來覆蓋它們,而這顯然不適用於語言級別。
這對Linq2Sql來說非常簡單,因爲我只需配置一個DataLoadOptions
對象並將其附加到上下文。與API關閉DbSet
我很難做到這一點。我正在尋找關於簡單實施戰略模式或類似的建議。
編輯:我想我的問題的實質是真正瞭解重寫泛型方法與非通用衍生版本。我正在尋找一種能讓我做到這一點的模式或技術。擴展方法是我正在研究的一件事,但如果有人擁有一個,則更喜歡更「純」的解決方案。
這是一個有趣的方法,但我不太喜歡的是該包含在一個位置。我與它的問題是,根據您可能需要不同的情況,例如同時獲得分頁客戶的列表,你不想要個人資料,發佈和發票信息...但是對於用戶詳細信息頁面,您確實需要所有信息 – 2011-07-05 05:31:38
是的,這是我在腦中辯論的一個難題試圖找出最好的方法來做到這一點。我現在用最簡單的選項(在單個地方定義它們),但是演進設計將使每個方法定義它們自己的包含,並將其作爲參數發送到基礎存儲庫,而不是它作爲類級變量。拉蒂斯拉夫的回答,我與上面的鏈接涵蓋了這一點。 – sliderhouserules 2011-08-23 17:29:09