Blog.

Typescript — IOC vs Dependency Injection

Cover Image for Typescript — IOC vs Dependency Injection
Alexandro castro
Alexandro castro

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.

image

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

image

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 ?

image

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…

image

Typescript — IOC vs Dependency Injection

References

https://github.com/AlexcastroDev/advance-javascript/blob/main/ioc_di/index.ts