Infrastructure
Criaremos um pacote (infraestructure). Dentro dele teremos dois pacotes: gateways e persistence.
Gateway: Criaremos uma classe chamada UserRepositoryGateway e daremos implements com UserGateWay.
Essa classe irá interagir com o Repository do SpringData (aquele que a gente geralmente cria no pacote repositores que extends JpaRepository). Basicamente, daremos um CTRL C + CTRL V. Fazendo uma copia do UserRepository para dentro do pacote persistence.
Assim que colocaremos o Repository do SpringData dentro do pacote persistence, poderemos importar ele para dentro da classe UserRepositoryGateway e criaremos um construtor para injetá-lo.
Para que o repository do SpringData não dependa do User inicial (entidade do banco), dentro do pacote Persistence criaremos um UserEntity contendo todas as características do User inicial, e assim poderemos usar anotações tanto do JPA quanto do SpringData.
Então o UserRepository de persistence, não apontará mais para <User>
, e sim <UserEntitity>
.
No gateway, precisaremos gerar essa UserEntity a partir de um Usuário de domínio (a classe User inicial).
Para fazermos isso e centralizar esse código, criaremos uma classe Mapper Veja aqui
Nele, teremos um método que retornará um UserEntity e um User.
UserEntity - O parâmetro passado, é o User inicial (classe domain).
Como passaremos os atributos no retorno desse método, criaremos um construtor na classe UserEntity. Mas sem o Id, pois ele será gerado automaticamente pelo Banco.
User - O parâmetro passado é o UserEntity (do pacote persistence)
E retornaremos um novo User passando os atributos do UserEntity.
Atualizado