Typescript — IOC vs Dependency Injection
Como usar e pra que serve ?
Há pouco tentei procurar um conteúdo sobre isso, mas não encontrei, então vou disponibilizar o conteúdo em texto e vídeo.
Flecto Educa é uma iniciativa entre os desenvolvedores da Flecto (https://flecto.io), onde compartilhamos conhecimento internamente, e decidi deixar esse conteúdo publico.
Então que problema resolvemos com Injeção de dependência ?
No exemplo abaixo, vemos que o SentryService e TwillioService está acoplado ao UserService.
Se quisermos trocar toda a aplicação de Twillio para Sendgrid, ou para qualquer outro serviço, vai ser um baita problema.
Então deixamos isso a cargo da injeção de dependência, que faz parte do “L” do S.O.L.I.D.
L — Liskov Substitution Principle (Princípio da substituição de Liskov)
“Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it”
Então criamos interfaces que sastifaz as implementações que precisamos
Ficou complexo ? vamos imagina que eu só precise de enviar um email para um cliente após cadastrar com sucesso.
Serviço1 ( um twillio, sendgrid, mailAlgumaCoisa ) implementa com NomeDaClasseS1.send()
Agora o Serviço2 implementa com NomeDaClasseS2.sendEmailTo()
Então você cria uma interface que tenha um “send”. Dentro do send, você escolhe se vai usar NomeDaClasseS1.send() ou NomeDaClasseS2.sendEmailTo().
O UserService pouco se importa quem ta realizando o funcionamento.
Alem disso, para fazer testes unitários, você não vai precisar de ter que depender que a classe de serviços de email e logger estejam funcionando junto. Só precisará fazer mock, e esperar que a função .send() seja chamada, respeitando o S do S.O.L.I.D.
Mas e o tal de IoC ?
Quem vai se preocupar em registrar os serviços e resolver para enviar ao UserService é ele.
IocContainer.register(EContainerKeys.mailerService, new MailerService());
IocContainer.register(EContainerKeys.loggerService, new LoggerService());
const userService = new UserService(
IocContainer.resolve<IMailerService>(EContainerKeys.mailerService),
IocContainer.resolve<ILoggerService>(EContainerKeys.loggerService),
);
userService.register('John Doe');
Teorias é ok, mas como já sabem…
References
https://github.com/AlexcastroDev/advance-javascript/blob/main/ioc_di/index.ts