Dependency Injection

  • Rafael Miceli
  • 12 Abr 2016

Uma vez que aplicamos DIP em nosso sistema, vamos iniciar o grafo de dependências do mesmo.

Quando criamos uma dependência?

Dependência em uma aplicação .Net C# é quando uma classe A precisa de alguma funcionalidade que esta em outra classe B, para isso a classe A vai precisar criar uma instancia da classe B, a criação dessa instância com a palavra-chave new cria uma ligação de dependência direta de A para B. Em outras palavras, A depende de B.

Fora as classes primitivas da nossa linguagem como int, string, bool e outras, todo o resto podemos considerar como dependência (DateTime também é uma dependência)

Uma forma simples de encontrar uma dependência em nossa classe é sempre quando vemos uma nova instância sendo feita com a palavra-chave new.

Dependency Injection (D.I.)

Se notaram no código do post anterior, toda dependência de nossas classes ficavam em seus construtores e pediam as mesmas por parâmetros do construtor.

MateriaService

Exemplo em nosso MateriaService acima que temos uma dependência com IMateriaRepo, mas pedimos a mesma através do construtor, repare também que criamos dependências, na maioria dos casos, a uma Interface e não a uma classe, mas a explicação do porque disso vem em outro post.

Pedir dependências pelo construtor é uma forma de injetarmos dependência em nossa classe. Chamamos essa forma de injetar dependência de Constructor Injection. Essa é a forma mais comum de injeção de dependência, e uma muito boa, pois assim, sabemos todas as dependência que nossa classe vai ter olhando apenas seu construtor.

Composition Root

Mas aonde começamos a instanciar nossas dependências? Em algum lugar temos que começar as instancias dessas classes. Nós fazemos isso em nosso Composition Root.

Composition Root, como o nome já diz, é a raiz de composição de nossa aplicação. Para cada tipo de aplicação o Composition Root vai estar em um lugar diferente.

Por exemplo em uma aplicação MVC, se estiver usando OWIN, vai ser no método Configuration no Startup.cs. Caso não esteja usando OWIN vai ser no Application_Start do Global.asax.

Poor Man’s Dependency Injection

Para apenas executar a aplicação com Dependency Injection uma forma fácil é fazer um Poor Man’s Dependency Injection.

Para aplicações de mundo real do dia a dia, EVITE FAZER ISSO. Essa é uma técnica que usamos apenas em situações bem específicas de aplicações do mundo real, mas uma aplicação Green Field pode se beneficiar de Dependency Injection com um Framework de D.I. Container (veremos em um próximo post).

Para fazer o Poor Man’s em um aplicação MVC, inicie as instância do seu grafo de dependências no construtor de seu controller. Exemplo:

MateriaController.cs

public class MateriaController : ApiController
{
    private IMateriaService _materiaService;

    public MateriaController()
    {
        var materiaRepo = new MateriaRepository();
        _materiaService = new MateriaService(materiaRepo);
    }

    // POST api/values
    public HttpResponseMessage Post([FromBody]Materia materia)
    {
        try
        {
            _materiaService.CriarNovaMateria(materia);

            return Request.CreateResponse(HttpStatusCode.Created);
        }
        catch (Exception ex)
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.Message);
        }
        
    }
    
}

Com isso temos nossa aplicação com Dependency Injection rodando, mas como disse, EVITE FAZER ISSO. No próximo post vamos ver uns D.I. Containers para .Net.

comentarios com Disqus Disqus