Mám špatnou interpretací záměr úložiště vzor?
Chystám se říci „ano“, ale vím, že já a každý člověk, kterého jsem pracoval s požádal totéž ze stejného důvodu ... „Nejsi myšlení 4. Rozměrově, Marty.“
Pojďme to trochu zjednodušit a držet se konstruktérů místo nejprve vytvořit metody:
Editor e = new Editor("Editor Name");
e = editorRepository.Add(e);
Project p = new Project("Project Name", e);
p = projectRepository.Add(p);
Vespod, váš projekt úložiště je vždy ukládání platný majitel ( p.EditorId
) do dat projektu, jak je to vytvořili, a však znovu naplnit projekty redaktor má, bude to tam. To je důvod, proč je to dobré praxe, aby všechny požadované vlastnosti do konstruktérů. Pokud nechcete předat celý objekt, prostě e.Id
udělá.
A když chci líné zatížení členské Editors, projekt potřebuje odkaz na úložiště stejně?
Nyní, jak znovu naplnit projekty redaktor je na vyžádání, máte několik možností v závislosti na tom, co se chystáte pro. Straight Repository říká chcete:
IEnumerable<Project> list = projectRepository.GetAllProjects()
.Where(x => x.editorId == e.Id);
Ale kam s ním? Ne uvnitř projektu, nebo editoru, máte pravdu, nebo budou muset získat přístup k úložišti, a to není dobré. Výše uvedený fragment je volně spojena, ale není na jedno použití o sobě. Jste právě dosáhli hranice úložišť Pattern.
Další na řadě je adaptér vrstvy pro danou aplikaci, se společným zdrojem úložišť ( StaticServiceWrapper
), a to buď nějaký EditorAdapter objektu (nebo v souhrnné nebo co byste jim zavolat) nebo nyní můžete kombinovat v rozšíření metod, které mohou mluvit všechny a všechna potřebná úložiště plynule. Neudělal jsem to přesně takhle se ve výrobním systému, ale ukázat vám stručnou příklad:
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);
}
}
V podstatě, když vaše GetAll, GetById, přidat, aktualizovat, odebrat objekt úložiště je hotovo, musíš opustit sdružení sami a jít dál nahoru v hierarchii objektů / vrstev na zábavu části, jako jsou adaptéry a Cache a obchodní logiky ( „Oh , my!“ ).