Salve, das belezas! Continuamos essa saga aqui no domênio de RunDesign. Agora vamos criar a nossa abstração aqui de Unit of Work, que na verdade vai usar o Unit of Work do MicroRM, para a gente poder usar esse cara aqui. Na verdade tem um monte de métodos lá, que a gente nem precisaria utilizar esses métodos aqui dentro. Vão ser poucos métodos. Então, como é algo que a gente vai reusar na nossa aplicação, primeiro poucos métodos. Então, como é algo que a gente vai reusar na nossa aplicação, primeiro ponto, aonde que esse unit of work vai ser estritamente utilizado? Somente em camada de application. A gente não vai usar ali no domínio. Então, nesse caso, eu vou criar aqui um unit of work ponto interface ponto tf. Então, vamos expor offwork.interface.ts Então vamos expor aqui esse cara, vou colocar assim iUnitOffWork Então eu quero colocar aqui um método commit que vai chamar o flush do microRM A gente vai depois acrescentar chamar o flush do microRM. A gente vai depois acrescentar aqui um método para poder pegar todos os agregados que foram persistidos, mas deixa na hora do evento que a gente vai fazer essa situação. Eu quero aqui também um rollback. O rollback não é necessariamente para poder fazer o rollback do modo transação, porque o initial pro-work lá do microRM já vai fazer. Mas a gente vai colocar esse método aqui para quando acontecer um erro, eu posso limpar todos os objetos que estão gerenciados ali, porque se esse Unit of Work for usado, se essa mesma instância que foi criada ali for reusada, pode tentar fazer a operação novamente e dar errado. Nós podemos adicionar outros métodos, mas isso aqui já está mais do que bom. Então, como isso também vai ser reusável, aqui na camada de infraestrutura, eu vou criar aqui o meu unit of work, traço micro, traço rm. Então, export class unit of work micro rm, implementa unit of work, na verdade, iUnitOfWork. Pronto. Então, nós temos que trabalhar aqui com dois métodos. Deixa eu implementar os dois. Para a gente poder trabalhar aqui, nós vamos receber como parâmetro, vou pegar o próprio EntityManager. Poderia passar o Int of Work direto, mas o EntityManager é conveniente aqui, porque a gente acessa por ele. Ele tem até outros métodos que poderiam ser utilizados, então eu prefiro utilizá-lo aqui. Então aqui vai ser um return. Aqui o flush retorna void. Então, beleza. Então, convenha. Estou encapsulando o flush e aqui, na verdade, vamos fazer um emclear. Tudo isso aqui está desencadeando lá no Unit of Work. O Clear também... O Clear não há promessa? Ah, sim, o Clear não há promessa. Aqui a gente coloca Async. Só para poder manter a compatibilidade. No rollback aqui também, eu poderia até tentar fechar o unit of work, mas aí isso é uma decisão que a gente veria numa situação mais avançada. O rollback, só de limpar ali, e se esse cara estiver sendo utilizado por outros, ele não vai ter acesso aos objetos, porque às vezes eu compartilho ele entre algumas camadas ali, a gente vai ver isso na questão de eventos, só que já seria suficiente. MicroRM vai considerar que a palavra aqui não é válida. Então agora, lá no nosso Customer Service, nós vamos pegar o nosso UOL, vou colocar assim, Unit of Work, abreviação para ficar mais simples. Então, aqui a gente recebe a interface. E aqui, antes de finalizar, await com o commit. Apenas uma linha que nós estamos adicionando. Show de bola. Então agora aqui no nosso teste que a gente tinha criado há duas aulas atrás, eu vou precisar pegar o... gerar aqui o unitOfWork, então ele fica aqui em cima, unitOfWork, que é o EM... ou melhor, que é um new unitOfWork microRM passando o EM para ele. E aí a gente passa a instância do unit of work. Então beleza, então quando eu registrar isso aqui eu vou ter obviamente... Posso fazer várias acessões aqui, não somente essa. O efeito ali não precisa nem desse await que ele colocou aqui. Quero ver se a instância é do customer, aí eu posso ver se o ID está definido, se o name é customer1 e se o CPF é exatamente ali do valor. Essa aqui é a primeira, o primeiro teste que eu tenho que fazer para de fato ver se pelo menos não aconteceu um erro, mas a gente ainda vai precisar recuperar lá do banco de dados para ver se está ok. Então, devem registrar um customer. Eu tenho que colocar o rm close aqui com a wait. Senão ele fica aqui tentando fechar a linha e fica esperando. Pronto. Então, passou. Agora, vamos fazer um em clear. Estou forçando aqui para que não tenha nenhum objeto, e a gente pode usar o list mais uma vez, ou o próprio repositório. Inclusive aqui agora também, aqui na parte de cima, eu preciso implementar o unit of work. Então aqui eu passo unit of work também. eu passo unit of work também. Aí aqui embaixo, vamos usar o próprio repositório mesmo, que vai ser mais direto. Então, a gente vai fazer um customer repo.indbyid. Posso pegar o customer.id aqui e armazenar nessa variável. Eu já tenho ali um customer, vou colocar customer found e aqui a gente pode passar as mesmas alterações. Pronto, então vamos rodar o teste mais uma vez. Pronto, só então. Toda operação que a gente precisar fazer qualquer alteração no banco de dados, nós vamos precisar desse Unit of Work. Agora nós podemos criar os outros applications, services que nós podemos fazer, tanto para o Partner quanto para o evento também. Então, pessoal, vamos seguir na nossa saga. É isso aí. E até a próxima.