Injeção de dependência em .NET: tudo que você precisa saber sobre o tema

Saiba o que é a injeção de dependência, como aplicar esse recurso em .NET e como esse design pattern pode facilitar a sua vida e otimizar o seu código

23 de Agosto de 2021 por Stefanini

A injeção de dependência tem ligação direta com dois princípios básicos de design orientados a objetos, os famosos SOLID. Sendo eles o Single Responsibility Principle (princípio da responsabilidade única) e Dependency Inversion Principle (princípio da inversão de dependência). Ou seja, é um recurso que facilita a compreensão e, principalmente, a manutenção do seu código.

No texto de hoje, conversamos com o Eduardo Silva Pinheiro, Desenvolvedor Sênior aqui da Stefanini, sobre a injeção de dependência em .NET, suas funcionalidades, benefícios e definições. Vem conferir!

O que é a injeção de dependência em .NET?

Para começar, é importante conhecer a definição de dependência, que é basicamente toda instância de uma classe feita por outra classe. Sabemos que essa relação de dependência entre classes gera uma baixa coesão do código, então precisamos encontrar alternativas para impedir muitos acoplamentos. A injeção de dependência é justamente uma alternativa para esse caso.

Uma definição mais formal do conceito desse design pattern é que ele se relaciona com o desacoplamento de módulos de software, e para isso:

●     módulos de alto nível não devem depender de módulos de nível mais baixo, mas sim de abstrações;

●     abstrações não devem depender de detalhes, mas detalhes devem depender de abstrações.

Esse recurso é capaz de criar independência em uma determinada classe. Eduardo acrescenta que dentro dos conceitos de SOLID, o de Inversão de Dependência geralmente é resolvido através da Injeção de Dependência. “Acredito ser o mais importante, justamente por desacoplar objetos da sua criação. Assim, uma alteração em um lugar no código não te obriga a alterar outros escopos e classes.”

O nosso Desenvolvedor Sênior ainda explica que através de mocks de dependências o processo de criação de testes de unidade fica mais fácil, garantindo a qualidade de refatoração do código. Além disso, dispensa a necessidade de um contexto e traz muita praticidade para a rotina da pessoa desenvolvedora.

Como utilizar esse recurso?

Primeiro, é importante ressaltar que você ainda vai ter uma relação de dependência, essa interface vai desacoplar o uso da classe de nível inferior, mas não sua instanciação. Ou seja, no seu código a instância da sua interface deve estar inserida. Eduardo traz uma dica para isso ficar mais claro: “Para utilizar a injeção de dependência, uma dada classe deve depender de interfaces, não de implementações específicas de uma classe que ela utiliza.

Essa regra evita que você substitua sua interface por outra diferente lá no seu código. Na prática utilizando injeção de dependência você escapa da tendência de criar muitas instâncias em diferentes partes do seu código e recorre ao container para injetar as instâncias necessárias nos pontos de demanda. O nosso dev sênior descreve um exemplo prático para facilitar a compreensão:

Se uma classe de cliente possui validação de email, por exemplo, ela não deve chamar a classe de email em si, mas utilizar uma interface no construtor que representa a classe de email. Desse modo, a classe de cliente não sabe, e nem deve saber, como é feita a validação de emails. Ou seja, o cliente apenas sabe que um dos passos para validar o cliente é ter um email válido, sendo essa responsabilidade da classe de email.

Como exemplo bem simples, podemos ver abaixo utilizando injeção através do construtor:

public class CustomerBusinessLogic

{CustomerDataAccess _dataAccess;

 

public CustomerBusinessLogic(ICustomerDataAccess custDataAccess)

    {

        _dataAccess = custDataAccess;

    }

 

    public CustomerBusinessLogic()

    {

        _dataAccess = new CustomerDataAccess();

    }

 

    public string ProcessCustomerData(int id)

    {

        return _dataAccess.GetCustomerName(id);

    }

}

 

public interface ICustomerDataAccess

{

    string GetCustomerName(int id);

}

 

public class CustomerDataAccess: ICustomerDataAccess

{

    public CustomerDataAccess()

    {

    }

 

    public string GetCustomerName(int id)

    {

        //get the customer name from the db in real application       

        return "Dummy Customer Name";

    }

}

Como esse design pattern facilita a rotina do dev?

A injeção de dependência traz muitos benefícios, como reusabilidade de componentes, facilidade para a manutenção de sistemas, aumento na legibilidade dos códigos, além de deixar seus projetos altamente testáveis. Eduardo reforça:

Com o desacoplamento do código, o processo para criar testes unitários é facilitado enormemente. Uma boa cobertura de testes de unidade permite que o código seja refatorado com mais segurança, deixando a manutenção do sistema mais simples. Além disso, um código desacoplado gera uma necessidade menor de alterações em cascata, e tende a ficar mais abstraído e por consequência reutilizável.”

Se você está buscando uma oportunidade para ser um desenvolvedor ou uma desenvolvedora em .Net, fique de olho nas nossas vagas.

Compartilhe:
Veja mais sobre Injeção de dependência

Vamos cocriar, solicite uma proposta dos nossos especialistas

Veja outros serviços capazes de complementar esta solução

testetetetete

testete

tatetadata

teste

tstete

aaaaaaaaaaaaaaaaa

Veja outros serviços capazes de complementar esta solução

Experience

Experience

testetetetete

Cyber Security

Cyber Security

testete

Machine Intelligence

Machine Intelligence

tatetadata

Enterprise Hosting

Enterprise Hosting

teste

Consulting

Consulting

tstete

IT Strategy

IT Strategy

aaaaaaaaaaaaaaaaa

Veja também

case

Cocriando soluções para um futuro melhor

case

Sophie - Assistente Virtual Inteligente