我誤解了Repository模式的意圖嗎?
我會說「是啊」,但要知道,我和每個人我已經問了同樣的事情,出於同樣的原因曾... 「你不是想第四維,馬蒂」。
讓我們把它簡化一點,與建設者堅守而不是首先創建方法:
Editor e = new Editor("Editor Name");
e = editorRepository.Add(e);
Project p = new Project("Project Name", e);
p = projectRepository.Add(p);
在下面,你的項目庫總是存儲有效所有者(p.EditorId
)到項目的數據,因爲它的創建,但是,如果您重新編輯編輯器的項目,它將會在那裏。這就是爲什麼將所有必需的屬性放入構造函數是一個好習慣。如果你不希望傳遞整個對象,只是e.Id
會做。
如果我想懶加載成員編輯器,項目還需要對存儲庫的引用?
現在,關於如何根據需求重新填充編輯器的項目,您有幾個選擇取決於您要做什麼。直存儲庫說,你想:
IEnumerable<Project> list = projectRepository.GetAllProjects()
.Where(x => x.editorId == e.Id);
但是把它放在哪裏?不是在Project或Editor中,你是對的,或者他們將不得不訪問存儲庫,這是不好的。上面的代碼片段是鬆散耦合的,但不能自行重用。您剛剛達到了Repository Pattern的限制。
接下來是適用於您的應用程序的一個適配器層,帶有一個共享資源庫(StaticServiceWrapper
)和某種類型的EditorAdapter對象(或Aggregate或任何您稱之爲的),或者現在您可以混合使用擴展方法可以流利地與任何和所有必需的存儲庫進行交流。我沒有做它到底這種方式在生產系統中,但向你展示一個簡明的例子:
public static class Aggregators
{
// one to one, easy
public static Editor GetOwner(this Project p)
{
return StaticServiceWrapper.editorRep.GetEditorById(p.editorId);
}
// one to many, medium
public static IEnumerable<Project> GetProjects(this Editor e)
{
return StaticServiceWrapper.projectRep.GetAllProjects()
.Where(x => x.editorId == e.Id);
}
// many to many, harder
public static IEnumerable<Editor> GetMembers(this Project p)
{
var list = StaticServiceWrapper.projectMemberMap.GetAllMemberMaps()
.Where(x => x.projectId == p.projectId);
foreach (var item in list)
yield return StaticServiceWrapper.editorRep.GetEditorById(item.editorId);
}
}
基本上,一旦你GETALL,GetById,添加,更新,刪除對象庫完成後,你已經有獨自離開了協會和移動上了對象/層層次的樂趣部件,如適配器和緩存和業務邏輯(「哦,我的天!」)。
你可能想看看我的相關問題:http://stackoverflow.com/q/20820302/253098 – SystematicFrank 2014-01-04 21:40:25