Αποθετήριο Μοτίβο: πώς να Lazy Load; ή, Θα πρέπει να χωρίσει το συνολικό αυτό;

ψήφοι
66

Έχω ένα μοντέλο τομέα που έχει την έννοια του συντάκτη και του έργου.

Ένα πρόγραμμα επεξεργασίας διαθέτει μια σειρά από έργα, και ένα έργο δεν έχει μόνο έναν ιδιοκτήτη Editor, αλλά και μια σειρά από μέλη Editor. Ως εκ τούτου, ο συντάκτης έχει επίσης μια σειρά από «ένωσε» έργα.

Παίρνω μια προσέγγιση DDD στην μοντελοποίηση αυτή και χρησιμοποιώντας το αποθετήριο πρότυπο για την επιμονή. Ωστόσο, δεν κατανοήσω το μοτίβο αρκετά καλά ακόμα για να καθορίσει το πώς θα πρέπει να το κάνουμε αυτό.

Δουλεύω στην υπόθεση ότι Editor και του έργου είναι δυνητικά στο ίδιο σύνολο, με τη ρίζα να Editor. Ως εκ τούτου, μπορώ να πάρω ένα πρόγραμμα επεξεργασίας και, στη συνέχεια, απαρίθμηση έργων του, και θα μπορούσε από εκεί να απαριθμήσει Συντάκτες μέλος των έργων.

Ωστόσο, αν μου επιτρέπεται μόνο για την ανάκτηση Συντάκτες από την αποθήκη μου, δεν σημαίνει αυτό που έχω να φορτώσει όλα τα έργα από το αποθετήριο όταν παίρνω το συντάκτη που τους ανήκει; Και αν θέλω να τεμπέλης φορτίο οι συντάκτες του μέλους, το έργο χρειάζεται μια αναφορά στο αποθετήριο, καθώς;

Εναλλακτικά, αν χωρίσει το συνολικό και έχουν μια αποθήκη Editor και ένα αποθετήριο του έργου, το πώς θα πρέπει να χειριστεί μια συναλλαγή σε όλη την δύο, όπως όταν ένα νέο έργο έχει προστεθεί σε ένα πρόγραμμα επεξεργασίας; Για παράδειγμα:

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

Είμαι παρερμηνεύουν την πρόθεση του αποθετηρίου μοτίβο;

Δημοσιεύθηκε 19/01/2009 στις 15:10
χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
3

Εξαρτάται από τις ανάγκες της εφαρμογής σας. Αν είναι ένα μεγάλο πρόβλημα για να φορτώσει όλα τα σχέδια για ένα συγκεκριμένο συντάκτη, στη συνέχεια, δοκιμάστε ένα χαλαρό σχέδιο φόρτωσης όπως μια εικονική μεσολάβησης .

Όσον αφορά νωχελικά φόρτωση των Συντάκτες μέλος ενός έργου, αν χρησιμοποιείτε Virtual μεσολάβησης, δεν βλέπω κάποιο πρόβλημα έγχυση του αντιπροσώπου με την EditorRepository δεδομένου ότι δεν θεωρώ ότι ο αντιπρόσωπος να είναι μέρος της περιοχής.

Αν χωρίσουν την Συγκεντρωτικά, μπορείτε να διερευνηθεί η Μονάδα Εργασίας μοτίβο ως μία λύση για την ατομικότητα. Το πρόβλημα, όμως, δεν είναι το μοναδικό στην DDD και είμαι βέβαιος ότι υπάρχουν και άλλες λύσεις για τη συναλλακτική συμπεριφορά.

Απαντήθηκε 23/01/2009 στις 01:45
πηγή χρήστη

ψήφοι
4

Τι λέτε για το διαχωρισμό των ευθυνών σε EditorOwner και μια EditorMember;

Χωρίς να γνωρίζουν τον τομέα σας, θα ήθελα να φανταστώ ότι θα έχουν διαφορετικές ευθύνες - για παράδειγμα, η EditorOwner μπορεί να είναι αρκετά πλούσια (και θα μπορούσε να είναι το συνολικό ρίζα), αλλά το έργο μπορεί να χρειάζεται μόνο για να ξέρετε ένα περιορισμένο ποσό για τα μέλη της, τόσο το αντικείμενο EditorMember μπορεί να είναι αρκετά ελαφρύ.

Αυτά τα αντικείμενα τομέα μπορεί επίσης να σχετίζεται με τους χρήστες, αλλά αυτό θα ήταν σε άλλο πλαίσιο.

Μήπως αυτό να βοηθήσει τα πράγματα, ή απλά να γίνει πιο περίπλοκο;

Απαντήθηκε 23/01/2009 στις 03:55
πηγή χρήστη

ψήφοι
0

Εδώ έχετε 2 διαφορετικές σχέσεις, ένα για την ιδιοκτησία και ένα για την ένταξη.

Η σχέση ιδιοκτησίας είναι απλή για πολλούς (έναν ιδιοκτήτη για κάθε έργο). Η σχέση των μελών είναι πολλές σε πολλές (πολλές Συντάκτες από το έργο, πολλά έργα του συντάκτη).

Θα μπορούσε να παρέχει ένα ακίνητο Ιδιοκτήτης με την κατηγορία του έργου, και να παρέχει μια μέθοδο για την ProjectRepository να πάρει όλα τα έργα που ανήκουν σε ένα συγκεκριμένο συντάκτη.

Για τις πολλές σχέσεις, παρέχει ένα ακίνητο μέλη σχετικά με την κατηγορία του έργου, και μια μέθοδο για την ProjectRepository να πάρει όλα τα έργα που περιέχουν ειδικό πρόγραμμα επεξεργασίας ως μέλος.

Φαίνεται, επίσης, ότι οι συντάκτες και Έργων είναι οντότητες, θα ήθελα να χωρίσει κατά πάσα πιθανότητα το συνολικό, αλλά ίσως αυτοί οι όροι έχουν μια συγκεκριμένη σημασία σε αυτό το πλαίσιο σας που κάνουν subentities του συνολικού.

Απαντήθηκε 11/02/2009 στις 12:01
πηγή χρήστη

ψήφοι
30

Είμαι παρερμηνεύουν την πρόθεση του αποθετηρίου μοτίβο;

Πάω να πω «ναι», αλλά να ξέρετε ότι εγώ και κάθε πρόσωπο που έχω δουλέψει με έχει ζητήσει το ίδιο πράγμα για τον ίδιο λόγο ... «Είσαι δεν σκέφτεται 4ο διαστάσεις, Μάρτι».

Ας το λίγο απλοποιήσει και να κολλήσει με τους κατασκευαστές αντί Δημιουργία μεθόδων πρώτο:

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θα κάνει.

Και αν θέλω να τεμπέλης φορτίο οι συντάκτες του μέλους, το έργο χρειάζεται μια αναφορά στο αποθετήριο, καθώς;

Τώρα, ως προς το πώς να συμπληρώσετε εκ νέου τα έργα ενός συντάκτη σε πρώτη ζήτηση, έχετε δύο επιλογές ανάλογα με το τι θα πάμε για. Ευθεία Repository λέει θέλετε:

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

Αλλά πού να το πω; Δεν εσωτερικό του έργου, ή Editor, έχεις δίκιο, είτε θα πρέπει να έχετε πρόσβαση στα αποθετήρια και αυτό δεν είναι καλό. Το παραπάνω απόσπασμα είναι χαλαρά συνδεδεμένες, αλλά δεν είναι επαναχρησιμοποιήσιμα από μόνη της. Απλά έχω φτάσει στα όρια της Repository μοτίβο.

Επόμενο είναι ένα Layer προσαρμογέα για την εφαρμογή σας, με μια κοινή πηγή αποθετήρια ( StaticServiceWrapper) και είτε ένα είδος EditorAdapter αντικειμένου (ή συγκεντρωτική ή ό, τι θέλετε να καλέσετε τους) ή τώρα μπορείτε να συνδυάσετε τις μεθόδους επέκτασης που μπορούν να μιλήσουν σε οποιαδήποτε και όλα τα απαραίτητα αποθετήρια ευφράδεια. Δεν το έχω κάνει ακριβώς με αυτόν τον τρόπο σε ένα σύστημα παραγωγής, αλλά για να σας δείξω ένα συνοπτικό παράδειγμα:

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, Προσθήκη, ενημέρωση, Αφαίρεση αντικειμένου αποθετήριο γίνεται, έχετε να εγκαταλείψουν τις ενώσεις μόνη της και να προχωρήσουμε μέχρι την ιεραρχία των αντικειμένων / στρώση με τα μέρη διασκέδασης όπως προσαρμογείς και προσωρινής μνήμης και επιχειρησιακή λογική ( «Ω , μου!» ).

Απαντήθηκε 14/05/2009 στις 03:40
πηγή χρήστη

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