Repository Pattern: jak Lazy zatížení? nebo bych měl rozdělit tohoto agregátu?

hlasů
66

Mám model domény, který má koncept editoru a Project.

An Editor vlastní řadu projektů a projekt má nejen vlastníka Editor, ale také počet členů Editor. Proto je Editor má také celou řadu „spojený“ projektů.

Beru přístup DDD pro modelování tohoto a používat úložiště vzor pro vytrvalostí. Nicméně, nemám Grok vzor natolik dobře, ještě určit, jak bych to měl dělat.

Pracuji na základě předpokladu, že Editor a projektu jsou potenciálně ve stejném souhrnu s bytí Editor root. I proto může dostat Editor a poté výčet svých projektech, a mohla odtud výčet členů Redakce projektů.

Nicméně, když jsem jen umožněno získat Editors z mého archivu, není to znamená budu muset načíst všechny projekty z úložiště, když jsem si editor, který je vlastníkem? A když chci líné zatížení členské Editors, projekt potřebuje odkaz na úložiště stejně?

Případně, když jsem rozdělil agregát a mají úložiště Editor a projekt úložiště, jak bych měl zvládnout transakci přes dva, například když se objeví nový projekt přidán do editoru? Například:

Editor e = new Editor(Editor Name);
editorRepository.Add(e);

Project p = e.CreateProject(Project Name);
projectRepository.Add(p);    // These two lines
editorRepository.Save(e);    // should be atomic

Mám špatnou interpretací záměr úložiště vzor?

Položena 19/01/2009 v 15:10
uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
3

Záleží na potřebách vaší aplikace. Pokud se jedná o velký problém načíst všechny projekty pro daný Editor, zkuste líné načítání vzor, jako je Virtual proxy .

Pokud jde líně načítání členů Redakce projektu, pokud používáte virtuální Proxy, nevidím problém vstřikování proxy s EditorRepository, protože se nedomnívám, proxy být součástí domény.

Pokud jste se rozešli souhrnu lze zkoumat jednotku práce vzor jako jeden řešení atomicity. Tento problém však není charakteristický pro DDD a jsem si jistý, že existují i jiné řešení pro transakční chování.

Odpovězeno 23/01/2009 v 01:45
zdroj uživatelem

hlasů
4

Jak se o rozdělení úkolů do EditorOwner a EditorMember?

Aniž by věděl svou doménu, tak bych si představit, že bych mít různé úkoly - například EditorOwner může být docela bohatý (a mohl by být celková root), ale projekt může znát pouze omezené množství o svých členů, takže objekt EditorMember může být poměrně lehké.

Tyto domény objekty se mohou týkat i pro uživatele, ale to by bylo v jiném kontextu.

Znamená to, že pomůže věci, nebo jen dělat to složitější?

Odpovězeno 23/01/2009 v 03:55
zdroj uživatelem

hlasů
0

Zde máte 2 různé vztahy, jeden pro vlastnictví a druhý pro členství.

Vztah vlastnictví je jednoduchý pro mnohé (jeden vlastník u každého projektu). Vztah členství je mnoho mnoho (mnoho editorů podle projektu, mnoho projektů editoru).

Ty by mohly poskytnout majetek vlastníka na třídě projektu, a poskytnout způsob na ProjectRepository, aby byly všechny projekty ve vlastnictví konkrétního Editor.

Pro mnoho vztah, poskytnout vlastnost členy na třídy projektu a způsob na ProjectRepository, aby byly všechny projekty, které obsahují zadaný Editor jako člen.

Zdá se také, že editoři a projekty jsou subjekty, asi bych rozdělil agregát, ale snad tyto pojmy mají svůj zvláštní význam ve svém kontextu, aby to subentities z agregátu.

Odpovězeno 11/02/2009 v 12:01
zdroj uživatelem

hlasů
30

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.Idudě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!“ ).

Odpovězeno 14/05/2009 v 03:40
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more