Repozytorium Wzór: jak Lazy obciążeniu? czy powinienem podzielić ten zespół?

głosy
66

Mam model domeny, który ma pojęcie redaktor i projektu.

Redaktorem posiada szereg projektów, a projekt ma nie tylko właściciela, Editor, ale także liczbę członków redakcji. Dlatego też Edytor posiada również szereg projektów „połączonych”.

Biorę podejście DDD do modelowania i to za pomocą wzoru Repository do wytrwałości. Ja jednak nie grok deseń na tyle dobrze, jeszcze do ustalenia, w jaki sposób należy to zrobić.

Pracuję na założeniu, że redaktor i projektu są potencjalnie w tym samym kruszywa, z korzeni będącego Editor. Dlatego mogę dostać edytora, a następnie wyliczyć swoje projekty, a może stamtąd wyliczyć Redakcja członków projektów.

Jednakże, jeśli wolno mi tylko do pobierania Editors z mojego repozytorium, nie robi to znaczy, że muszę załadować wszystkich projektów z repozytorium, gdy pojawia się edytor, który jest ich właścicielem? A jeśli chcę leniwy obciążenia Redakcja członkowskich, projekt musi odniesienie do repozytorium, jak również?

Ewentualnie, jeśli podzielić kruszywo i mieć repozytorium redaktor i repozytorium projektu, w jaki sposób należy obsługiwać transakcji między dwoma, na przykład gdy nowy projekt zostanie dodany do edytora? Na przykład:

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

Ja misinterpreting intencji Repository deseń?

Utwórz 19/01/2009 o 15:10
użytkownik
W innych językach...                            


4 odpowiedzi

głosy
3

To zależy od potrzeb aplikacji. Jeśli jest to duży problem, aby załadować wszystkich projektów w danym edytorze, a następnie spróbuj leniwe ładowanie Wzorzec jak Wirtualnej Proxy .

Odnośnie leniwie ładowania Redakcja członkiem Project, jeśli korzystasz z wirtualnego serwera proxy, nie widzę problemu wstrzykiwanie proxy z EditorRepository ponieważ nie uważam, pełnomocnik być częścią domeny.

Jeśli podzielić kruszywa, można zbadać jednostka pracy wzór jako jedno rozwiązanie atomowości. Problem ten, choć nie jest unikalna dla DDD i jestem pewien, że istnieją inne rozwiązania dla zachowania transakcyjnej.

Odpowiedział 23/01/2009 o 01:45
źródło użytkownik

głosy
4

Jak o podział obowiązków w produkt EditorOwner i EditorMember?

Nie znając swoją domenę, to bym sobie wyobrazić, że mają one różne zadania - na przykład EditorOwner może być dość bogate (i może być łączna root), ale projekt może trzeba tylko wiedzieć ograniczoną ilość o swoich członków, tak przedmiotem EditorMember może być dość lekki.

Te obiekty domeny może również odnosić się do użytkowników, ale to byłoby w innym kontekście.

Czy to pomoże rzeczy, lub po prostu zrobić to bardziej skomplikowane?

Odpowiedział 23/01/2009 o 03:55
źródło użytkownik

głosy
0

Tutaj masz 2 różne relacje, po jednym dla własności i jeden dla członkostwa.

Relacja własności jest prosta jeden do wielu (jeden właściciel dla każdego projektu). Relacja członków jest wiele do wielu (wielu Redakcja Project, wiele projektów przez redaktora).

Można zapewnić Właściciel nieruchomości na klasy projektu i opracowanie sposobu na ProjectRepository aby wszystkie projekty należące do określonego Editor.

Dla wielu relacji, stanowią własność członków w klasie Projektu oraz sposób na ProjectRepository aby wszystkie projekty zawierające określony Edytor jako członka.

Wydaje się również, że redaktorzy i projekty są podmioty, prawdopodobnie podzielone kruszywo, ale być może te terminy mają szczególne znaczenie w kontekście swojej które sprawiają, że subentities agregatu.

Odpowiedział 11/02/2009 o 12:01
źródło użytkownik

głosy
30

Ja misinterpreting intencji Repository deseń?

Mam zamiar powiedzieć „tak”, ale wiem, że ja i każdy człowiek mam pracował z poprosiła samo dla tego samego powodu ... „Ty nie myśleć 4th wymiarowo, Marty”.

Załóżmy uprościć go trochę i trzymać się z konstruktorów zamiast Tworzenie metod pierwszy:

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

Project p = new Project("Project Name", e);
p = projectRepository.Add(p);

Pod spodem, repozytorium projektu jest zawsze przechowywania ważnego właściciela ( p.EditorId) do danych projektu, jak to jest stworzone, a więc ponownego zapełniania projektów redaktora, to tam. To dlatego, że jest to dobra praktyka, aby umieścić wszystkie wymagane właściwości do konstruktorów. Jeśli nie chcesz przekazać cały obiekt, po prostu e.Idzrobi.

A jeśli chcę leniwy obciążenia Redakcja członkowskich, projekt musi odniesienie do repozytorium, jak również?

Teraz, w jaki sposób, aby ponownie wypełnić projekty redaktora na żądanie, masz kilka opcji do wyboru, w zależności od tego, co masz zamiar do. Prosto Repository mówi chcesz:

IEnumerable<Project> list = projectRepository.GetAllProjects()
                                .Where(x => x.editorId == e.Id);

Ale gdzie go umieścić? Nie wewnątrz projektu lub edytora, masz rację, albo będą musieli uzyskać dostęp do repozytorium, a to nie jest dobre. Powyższy fragment jest luźno, ale nie jest wielokrotnego użytku na własną rękę. Po prostu wyczerpała Repository Pattern.

Następna w kolejce jest warstwą Adapter do aplikacji, z udostępnionego źródła repozytoriów ( StaticServiceWrapper) i albo jakiś przedmiot EditorAdapter (lub kruszywa lub cokolwiek chcesz je nazwać) czy teraz można mieszać metod rozszerzających, że może rozmawiać z każdym i wszystkie niezbędne repozytoria Płynnie. Nie zrobili to dokładnie w ten sposób w systemie produkcyjnym, ale pokazać zwięzłą przykład:

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);
    }
}

Zasadniczo raz swój GETALL, GetById, dodawać, aktualizować Usuń Repozytorium Obiekt jest zrobione, musisz zostawić skojarzeń i przenieść się w górę hierarchii obiekt / warstwy do części zabawy jak Adaptery zapewnia cache i Business Logic ( „Oh mój!” ).

Odpowiedział 14/05/2009 o 03:40
źródło użytkownik

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