DDD: repository per un'entità nidificata?

0

Ho una AR chiamata User , che ha tra le altre entità quella chiamata City .

Il modo in cui assegno un City a User è: $user->addCity($city);

Il problema si presenta quando viene dato un id su qualche endpoint di Controller invece di un'entità City , non posso metterli in relazione se non è attraverso un'istanza e non riesco a recuperare l'intance dell'entità senza un repository.

Potrei recuperare l'entità con CityRepository e poi aggiungerla a User , ma per quanto dovrei usare solo un repository per AR.

Per il momento, sto ottenendo il riferimento tramite EntityManager di Symfony:

    public function __construct(UserRepository $users)
    {
        $this->users = $users;
    }


    public function execute(Passenger $user, int $cityId, string $companyName = '')
    {
        $city = $this->users->getCityReferenceById($cityId);
        $user->addCity($city);
        ....
    }

mentre su UserRepository:

public function getCityReferenceById(int $cityId): City
{
    return $this->em->getReference(City::class, $cityId);
}
    
posta vivoconunxino 21.11.2018 - 11:03
fonte

2 risposte

1

Penso che la domanda qui sia; hai bisogno di un intero oggetto urbano per l'utente?

Corretto che un utente sia residente in una città, ma in questo particolare dominio, sei interessato ai dettagli della città (nome, paese, ecc.) dalla prospettiva dell'utente ? o sarà sufficiente avere solo il cityId? - vale a dire, richiederebbe la tua funzionalità per cambiare il nome, il paese, ecc. di una città attraverso un utente?

Se la Risposta al primo è sì, allora suggerisco di rivedere il tuo Aggregato, forse l'Utente non è l'AR qui. Se no, e vuoi solo avere i dettagli completi della città allo scopo di popolare una vista, allora forse guarda CQRS , che mira a separare le preoccupazioni di query / read / display side introducendo un modello di lettura separato.

    
risposta data 23.11.2018 - 17:02
fonte
1

Penso che il problema che stai descrivendo (e quindi il caso d'uso che ti occorre) sia causato dai confini che vengono disegnati nei posti sbagliati. Una City è chiaramente un'entità a sé stante soggetta ai propri vettori di cambiamento. Ad esempio, chiaramente non cambieresti name , population , ecc. Di un City attraverso un User .

La relazione tra City e User sembra essere l'idea più interessante del tuo dominio e non ancora esplicitata. Si può immaginare un Residence (o forse una parola migliore) come rappresentante del join tra un User e un City che contiene informazioni aggiuntive su una determinata relazione di User con City .

Questi attributi potrebbero essere inseriti nella tua tabella [User] insieme a [CityId] o separati in una tabella di join.

    
risposta data 21.11.2018 - 16:38
fonte

Leggi altre domande sui tag