Come aggiungere una nuova entità figlio a un repository in DDD?

1

Sono nuovo in Domain-Driven Design e lo sto utilizzando in un'applicazione che sto sviluppando. Mi sto bloccando su come mettere nuove entità in un repository. Il mio repository è solo una grande raccolta di entità che posso interrogare.

Una delle mie entità può avere entità figlio, quindi gli ho dato un metodo AddChild() . Utilizza una fabbrica per creare un'istanza del bambino e aggiunge il figlio a una raccolta secondaria.

Come dovrei aggiungere questa nuova entità figlia al mio repository?

Non voglio che il chiamante di AddChild() lo aggiunga, e ho letto che le entità stesse non dovrebbero accedere agli archivi .

    
posta M. Dudley 13.01.2015 - 22:54
fonte

2 risposte

2

Ho una situazione simile, in quanto il mio modello di dominio è costituito da una rete di entità collegate. L'ho risolto in questo modo:

Per ciascun tipo di entità, ho un EntityRepository corrispondente. Le Entità sono completamente inconsapevoli dell'esistenza dei repository.

Ogni tipo di EntityRepository mantiene una cache delle istanze Entity di cui è a conoscenza (quelli che sono stati recuperati da quel repository) e ha riferimenti ai repository delle entità collegate.
Quando salva un'entità nel suo repository, il repository verifica se conosce l'entità e la inserisce nel database (e nella sua cache) o aggiorna il database. Per le entità collegate, il repository richiede al repository dell'elemento collegato di salvare quell'elemento e quindi aggiorna i collegamenti del database tra le entità.
Le entità che sono dissociate l'una dall'altra vengono rilevate automaticamente in modo simile nei repository.

Per dare un esempio in pseudocodice:

// Entities
class Child { }

class Parent
{
    addChild(Child);
    Child[] getChildren();
}


// Repositories
class ChildRepository
{
    save(Child entity)
    {
        if (cache.contains(entity))
            updateDatabase(entity);
        else
            AddToDatabase(entity);
    }
    Child[] cache
}

class ParentRepository
{
    save(Parent entity)
    {
        if (cache.contains(entity))
            updateDatabase(entity);
        else
            AddToDatabase(entity);
        childRepo.save(entity.children());
        updateParentChildLinkTable();
    }
    Parent[] cache
    ChildRepository childRepo
}
    
risposta data 14.01.2015 - 10:39
fonte
6

I repository sono in genere solo per i root aggregati. Non c'è bisogno di repository per non root (ciò che chiamate "child"?) Entità perché sono persistenti e caricati automaticamente insieme all'aggregato a cui appartengono.

    
risposta data 14.01.2015 - 14:55
fonte

Leggi altre domande sui tag