Swinject part II - Padrões de injeção de dependência


Padrões de injeção de dependência

Quando falamos sobre injeção de dependência, existem alguns padrões diferentes que podemos usar para isso. Vou listar aqui três desses padrões que são citados na documentação do Swinject e que são suportados pela lib. Você pode conferir isso na íntegra na documentação.

Initializer Injection

O “Initializer injection” é um padrão no qual você passa as dependências da classe via método inicializador. Ou seja, no momento da criação do objeto, você recebe no construtor as instâncias das dependências dele e, internamente, o método vai injetá-las para você. Abaixo, um exemplo utilizando Swinject:

No código, criei o protocolo “CatProtocol” que vamos usar no Swinject dentro do container. Ele é bem simples: diz que a classe que o implementar vai precisar ter uma dependência de um objeto da classe “Owner”, que estende a "OwnerProtocol”.

Criei a classe “Cat”. Ela usa o padrão Initializer injection para receber uma instância de Owner. Ou seja, recebe a dependência via construtor.

A classe Owner também tem um protocolo que será utilizado mais tarde no Swinject:

E essa é a implementação da classe:

A inicialização manual seria algo assim:

Mas como fazemos isso usando o Swinject?

  • Primeiro, dizemos ao Swinject: “Ei, sempre que eu pedir um objeto que conforme o protocolo OwnerProtocol, essa é a resolução que eu quero — ou seja, um objeto da classe Owner, iniciado com o nome que vou passar como parâmetro.”

  • Depois, faço minha injeção de dependência via construtor — ou seja, Initializer injection — dizendo: “Ei, Swinject, quando eu pedir um objeto que conforme o protocolo CatProtocol, me entregue um Cat e injete nele o Owner resolvido anteriormente.”

  • Observação: para o exemplo não ficar muito complexo, deixei um nome padrão para o Owner no momento da resolução da dependência pelo Swinject. Fiz isso porque, logo abaixo, quando peço para o próprio Swinject resolver a dependência de Cat para injetar via construtor, não quero precisar passar nenhum argumento na hora da instanciação.

Agora, só precisamos pedir para o Swinject resolver a instância do objeto, que internamente fará a injeção de dependência necessária.

Resultado:

Property Injection

Property Injection é um padrão de injeção de dependência no qual injetamos a dependência acessando diretamente a propriedade de um objeto já instanciado. Esse padrão é útil quando a dependência é opcional — ou seja, não é crucial para a classe — ou quando, por algum motivo, você ainda não tem a instância do objeto que será injetado posteriormente.

Segue abaixo o exemplo:

Primeiro, criamos um protocolo “PetProtocol” que estabelece uma dependência opcional:

Agora, temos o a classe “Dog” que conforma esse protocolo:

No momento da resolução, no container, instanciamos um objeto da classe que tem uma dependência opcional, pedimos para o Swinject resolver essa dependência para nós e, depois, injetamos ela acessando diretamente a propriedade da instância. Em seguida, devolvemos o objeto já com a dependência injetada:

Method Injection

Esse padrão é parecido com o property injection, mas usa um método da própria classe para passar as dependências da instância. Isso é útil para ter mais controle na hora de modificar a instância, realizando essa modificação em um ambiente controlado dentro da própria classe.

Abaixo, um exemplo:

Criamos o protocolo PetProtocol2:

E a classe Cat2, que extende esse protocolo:

No momento da injeção de dependência, chamamos o método da classe que vai realizar a injeção da dependência nela:

Conclusão

Esses são os padrões que a documentação oficial do Swinject apresenta como possibilidades. Vou abordar mais assuntos relacionados à injeção de dependências no iOS com Swift e sobre Swinject em outros posts.

0
Subscribe to my newsletter

Read articles from Julio Cesar ( Jovem Stark ) directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Julio Cesar ( Jovem Stark )
Julio Cesar ( Jovem Stark )