Bom, eu vou falar como EU costumo fazer. não sei se é o certo, e nem sei se exite um certo e um errado nessa história.
Eu teria meu dominio da seguinte maneira mais ou menos. não exatamente com esses nomes, vou usar eles apenas para deixar o conceito mais claro
Conta
Transferencia
ContaRepositório
TransferenciaRepositorio
Vc reparou que os repositório fazem parte do dominio? como assim? eles não são parte da camada de persistencia?
Não. Eles também fazem parte do dominio. e objetos de dominio podem conversar entre si livremente para implementar regras de negócio.
a classe transferencia poderia receber uma referencia ao repositório de contas, e ao final da operação, inserir estas contas no repositório para que sejam persistidas.
algo como
public class Transferencia{
ContrasRepositoriio contasRepo;
//A transferencia tem uma dependencia do repositório de contas,
// aqui vc usar seu motor de injeção de dependencias favorito, guice, pico, spring, sei lá
public Transferencia(ContasRepositorio repo){
this.contasRepo = repo;
}
//Este método deve ser transacionado,
public transferirDinheiro(Conta aCreditar, Conta aDebitar, BigDecimal valor){
aDebitar.saque(valor);
aCreditar.depoisto(valor);
//E agora? agora vamos persistir as duas contas para "efetivar" a transferência.
this.contasRepo.save(aCreditar);
this.contasRepo.save(aDebitar);
}
}
Este código no mundo real naõ faria apenas essas operações, a transferencia teria atributos para guardar quais as contas, qual o valor, horario e etc.
A ta, entendi. mas e a transferencia? Vc não precisaria persistir ela pra que ela possa aparecer no extrato, por exemplo?
Sim, mas persistir a transferencia é de obrigação de quem a criou. lá após a chamada a transferir(), a transferencia será persistida.
Agora quem cria a transferencia? sei lá. Pode ser uma fachada ou um ServicoFinanceiro, que disponibiliza todas as operações como saque, deposito, transferencia, desde que garantam a atomicidade da operação.