DDD: serviço contém dois repositórios

8

Ele corrige a maneira de ter dois repositórios dentro de um serviço e será um aplicativo ou serviço de domínio?

Suponha que eu tenha um objeto Passenger que deve conter o objeto Passport (ID do governo). Estou recebendo o Passenger de PassengerRepository. O PassengerRepository cria uma solicitação ao servidor e obtém dados (json) do que analisa os dados recebidos e armazena no repositório.

Estou confuso porque quero armazenar o Passport como Entidade e colocá-lo no PassportRepository, mas todas as informações sobre a senha contêm dentro do json do que recebi acima.

Eu acho que devo criar um PassengerService que incluirá PassengerRepository e PassportRepository com vários métodos como removePassport, addPassport, getAllPassengere etc.

ATUALIZAR:

Então, acho que a melhor maneira é representar o Passport como VO e armazenar todos os passaportes no agregado de passageiros. No entanto, há outra pergunta: onde devo colocar os métodos (métodos chama API do servidor) para o passaporte do passageiro de gerenciamento. Eu acho que o melhor lugar é o agregado de passageiros.

tikhop
fonte

Respostas:

7

Não é algo inédito para um serviço ter dois repositórios, mas geralmente é uma dica de um design ruim. Vale a pena olhar para ver se você pode melhorar seu design, mas, se você olhar e não pode melhorar, não deve se preocupar muito.

No seu caso, acho que você precisa examinar o conceito de agregados no DDD.

Agregados são grupos de coisas que pertencem um ao outro. Uma raiz agregada é o que os mantém unidos.

Se Passageiro e Passaporte não pertencem um ao outro, não sei o que faz. Sua raiz agregada nesse caso deve obviamente ser passageira.

pdr
fonte
Sim, eu sei sobre agregados, com certeza. Ok, se um Passageiro é Agregado e contém todo o passaporte de passageiro, onde devo colocar os métodos (métodos chamados API do servidor) para adicionar ou remover passaportes, dentro do objeto Passageiro?
Tikhop 7/11
@tikhop: Difícil saber com certeza sem estar no seu código, mas eu imagino que sim.
Pdr7 Nov12
0

Concordo plenamente com o @pdr que você não precisa se culpar por causa de um repositório adicional em seu serviço.

Sobre os métodos de passaporte, como addPassport, acho que eles devem permanecer no PassengerService e no 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
fonte