DDD: el servicio contiene dos repositorios

8

¿Corrige la manera de tener dos repositorios dentro de un servicio y será una aplicación o un servicio de dominio?

Supongamos que tengo un objeto Pasajero que debería contener un objeto Pasaporte (identificación del gobierno). Estoy obteniendo Passenger de PassengerRepository. PassengerRepository crea una solicitud al servidor y obtiene datos (json) que analiza los datos recibidos y los almacena dentro del repositorio.

Me he confundido porque quiero almacenar Passport como Entity y ponerlo en PassportRepository pero toda la información sobre la contraseña contiene dentro de json que recibí anteriormente.

Supongo que debería crear un PassengerService que incluirá PassengerRepository y PassportRepository con varios métodos como removePassport, addPassport, getAllPassengery etc.

ACTUALIZAR:

Así que supongo que la mejor manera es representar el Pasaporte como VO y almacenar todos los pasaportes dentro del agregado de Pasajeros. Sin embargo, hay otra pregunta: dónde debo poner los métodos (métodos llama al servidor api) para la gestión del pasaporte del pasajero. Creo que el mejor lugar es el agregado de Pasajeros.

tikhop
fuente

Respuestas:

7

No es raro que un servicio tenga dos repositorios, pero a menudo es un indicio de un mal diseño. Vale la pena mirar, para ver si puedes mejorar tu diseño pero, si miras y no puedes mejorarlo, no debes preocuparte demasiado.

En su caso, creo que necesita mirar el concepto de Agregados en DDD.

Los agregados son grupos de cosas que pertenecen juntas. Una raíz agregada es lo que los mantiene unidos.

Si Pasajero y Pasaporte no van juntos, no sé qué hace. Su raíz agregada en este caso obviamente debería ser Pasajero.

pdr
fuente
Sí, sé sobre los agregados con seguridad. Ok, si un pasajero es agregado y contiene todo el pasaporte de pasajero, ¿dónde debo colocar los métodos (métodos llamadas API del servidor) para agregar o quitar pasaportes, dentro del objeto Pasajero?
tikhop
@tikhop: Es difícil saberlo con seguridad sin estar en su código, pero me imagino que sí, sí.
pdr
0

Estoy totalmente de acuerdo con @pdr en que no es necesario que te culpes por un repositorio adicional en tu servicio.

Acerca de los métodos de pasaporte, como addPassport, creo que deberían permanecer en PassengerService y en Passport Repository. Algo como:

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(...);

   }


}
Gabriel Lopes
fuente