1

ASP.NET Core Injeção de dependência

#.NET Core #.NET
Marcos Fatima
Marcos Fatima

Durante o desenvolvimento de um projeto, é uma boa prática separar e dividir as responsabilidades. E como nem tudo no mundo da programação é maravilha, surge as dependências, e precisamos solucionar esse problema.

A DI (injeção de dependência) é um padrão de design de software, que ajuda a nós programadores a alcançar o IoC (inversão de controle) entre nossas classes e suas dependências.

Como todo projeto de software está sempre em constantes mudanças, é importante escrever um código testável, de fácil manutenção, ou seja, visando o isolamento de responsabilidades, e o mínimo de acoplamento possível. E para alcançar essas boas práticas no desenvolvimento, é fundamental implementar esse padrão de design de software.

Este padrão está diretamente relacionado com um dos princípios do solid, o DIP — Dependency inversion principle, que em português, Princípio da Inversão de Dependência.

E respondendo à pergunta, vale muito a pena implementar esse padrão, pois com ele consegue facilmente substituir regras de negócio, sem ter aquela dor de cabeça de ter que sair mudando código em todo o projeto.

Dependa sempre da abstração

Durante o desenvolvimento de sua aplicação em determinados pontos você vai criar interfaces, que são basicamente contratos, onde eles dirão o que deve ser feito, e não como deve ser feito.

Os princípios SOLID

Como a injeção de dependência está relacionada com boas práticas no desenvolvimento, não poderia deixar de comentar sobre os princípios do solid, pois são uma base importante no mundo da programação orientada a objetos, e na construção de um código limpo.

SRP — Single responsibility principle

Princípios da Responsabilidade Única, é o primeiro princípio que compõem o solid. Ele tem como objetivo garantir que a classe tenha somente um motivo para ser modificada.

OCP — Open/closed principle

Princípio do Aberto/Fechado, afirma que uma classe (método ou função) deve permanecer aberta para extensões e fechada para modificações.

Bom, em outras palavras significa que esta classe pode ter esse comportamento alterado quando necessário, mas sem a alteração de seu código fonte. E isto pode ser feito com a utilização da herança.

LSP — Liskov substitution principle

Princípio da substituição de Liskov, este princípio diz que as classes bases devem ser substituíveis por suas classes derivadas.

Existe até uma brincadeira para facilitar o entendimento desse princípio, que diz:

SOLID — LSP — Abstração problemática

ISP — Interface segregation principle

Princípio da segregação de interfaces, afirma que utilizar muitas interfaces são melhores que utilizar uma única interface geral. Ou seja, podemos dizer que o princípio alerta que uma interface não deve fazer uma classe implementar coisas que não irá utilizar.

DIP — Dependency inversion principle

Princípio da inversão de dependência — Dependa de abstrações e não de implementações. Este princípio deixa claro que sempre devemos depender de abstrações e não das implementações, pois elas mudam com uma frequência menor, se comparar com as mudanças na implementação, e facilitam na evolução do código.

Estes princípios são a base para se tornar um desenvolvedor de software de qualidade, pois eles são a base para muitos padrões de projetos, e contribui para evolução, mas sempre se preocupando com a manutenção e com a facilidade em mudanças necessárias.

Resolvendo as Dependências

Atualmente no mercado existes diversas soluções para esse problema como o framework Ninject. Mas o ASP.NET Core vem com uma resolução de dependências nativa, facilitando a forma de implementar este padrão, e que atende a grande maioria dos senários.

E um ótimo local para resolver as dependências são ao iniciar a sua aplicação, sendo mais preciso na classe Startup.

Tempos de vida do serviço

Na hora de implementar a injeção é necessário conhecer os tempos de vida do serviço, para uma aplicabilidade assertiva.

Transitório

Serviços temporários de tempo de vida (AddTransient) são criados sempre que o serviço for solicitado, ideal para serviços sem estados, ou seja serviços que você não irá reaproveitar nada.

Com escopo

Os serviços com tempo de vida (AddScoped) são criados sempre que o cliente faz uma solicitação, e permanecem até o fim da mesma.

Singleton

Serviços de tempo de vida singleton (AddSingleton) são criados na primeira solicitação, e todas as outras solicitações realizadas pelo cliente vão utilizar a mesma instância. Um cenário comum em utilizar esse serviço, são em conexões com a base de dados.

Código

Os tempos de vida do serviço são utilizados na inicialização da aplicação, mais precisamente na classe Startup.cs da sua API, como mostrado no código abaixo:

Não foi fornecido texto alternativo para esta imagem

Injetando objetos nos Controllers

Depois de realizar a injeção das dependências na classe Startup, podemos injetar os objetos em nossos controllers, essa injeção pode ser realizada de duas formas, sendo elas manualmente ou via FromServices.

Injetando Manualmente

Na imagem abaixo, fazemos a injeção de forma manual, onde temos uma propriedade, normalmente privada e somente leitura, que recebe a instância do objeto.

Não foi fornecido texto alternativo para esta imagem

Utilizando o construtor da classe, criamos a injeção de dependência, que será resolvida pelo ASP.NET Core, gerando a instância do objeto. Logo em seguida, passamos a instância do objeto gerado para nossa propriedade privada, assim finalizando o processo. Nesse exemplo podemos observar a utilização de dois princípios do Solid, DIP e ISP.

FromServices

Utilizando o fromServices nossa injeção de dependência fica de uma forma mais limpa nos controllers, observe o código abaixo:

Não foi fornecido texto alternativo para esta imagem

O interessante dessa forma, é que tiramos a necessidade de criar uma propriedade para receber a instância. E utilizando essa forma, reduzimos a quantidade de linhas de código, deixando nossos controllers mais enxutos.


Referências

https://docs.microsoft.com/pt-br/aspnet/core/fundamentals/dependency-injection

https://medium.com/thiago-aragao/solid-princ%C3%ADpios-da-programa%C3%A7%C3%A3o-orientada-a-objetos-ba7e31d8fb25

https://www.casadocodigo.com.br/products/livro-oo-solid

https://docs.microsoft.com/pt-br/dotnet/architecture/modern-web-apps-azure/architectural-principles#dependency-inversion

1
33

Comentários (1)

0
Natasha Gulyas

Natasha Gulyas

01/01/2021 16:24

Obrigada por compartilhar Marcos!

Artigo copiado para agregar aos meus estudos!!


Grande abraço e feliz ano novo!!!


None