DDD: il servizio contiene due repository

8

È corretto il modo di avere due repository all'interno di un servizio e sarà un servizio di applicazione o dominio?

Supponiamo che io abbia un oggetto Passeggero che dovrebbe contenere l'oggetto Passport (governo id). Sto ottenendo Passenger dal PassengerRepository. PassengerRepository crea una richiesta al server e ottiene i dati (json) che analizza i dati ricevuti e li memorizza all'interno del repository.

Mi sono confuso perché voglio memorizzare Passport come entità e metterlo in PassportRepository ma tutte le informazioni sulla password contengono all'interno di json di quanto ho ricevuto sopra.

Credo che dovrei creare un PassengerService che includerà PassengerRepository e PassportRepository con diversi metodi come removePassport, addPassport, getAllPassenger ed ecc.

UPDATE:

Quindi immagino che il modo migliore sia rappresentare Passport come VO e memorizzare tutti i passaporti nell'aggregato di Passenger. Tuttavia c'è un'altra domanda: dove dovrei mettere i metodi (i metodi chiamano API del server) per il passaporto del passeggero di gestione. Penso che il posto migliore sia così all'interno dell'aggregato di passeggeri.

    
posta tikhop 07.11.2012 - 14:50
fonte

2 risposte

7

Non è raro che un servizio abbia due repository, ma spesso è un suggerimento di un design scadente. Vale la pena guardare, per vedere se è possibile migliorare il tuo design ma, se guardi e non riesci a migliorarlo, non dovresti preoccuparti troppo.

Nel tuo caso, penso che tu abbia bisogno di guardare il concetto di Aggregates in DDD.

Aggregates are groups of things that belong together. An Aggregate Root is the thing that holds them all together.

Se Passenger e Passport non appartengono insieme, non so cosa faccia. La tua radice aggregata in questo caso dovrebbe essere ovviamente Passenger.

    
risposta data 07.11.2012 - 15:10
fonte
0

Sono totalmente d'accordo con @pdr che non devi incolpare te stesso a causa di un repository aggiuntivo nel tuo servizio.

A proposito dei metodi del passaporto, come addPassport , penso che dovrebbero rimanere in PassengerService e nel repository di passaporto. Qualcosa come:

public class PassengerService : ServiceBase<Passenger>, IPassengerService {

    private readonly IPassportRepository _passport_repository;
    private readonly IPassengerRepository _pass_repository

    public PassengerService(IPassportRepository passport_repository,     IPassengerRepository passenger_repository) {
        ...

    }


   public void removePassport(...) {
       _passport_repository.remove(...);

   }


}
    
risposta data 10.01.2018 - 14:51
fonte