Como trocar o framework de injeção de dependência no asp.net core para o Autofac

Facebooktwittergoogle_plusredditpinterestlinkedinmail

Agora que já vimos como utilizar injeção de dependência no .net core para aplicações web e aplicações console, vamos ver como trocar o framework padrão do .net por outro de nossa preferência, como o Autofac, que é o container que iremos utilizar em nosso exemplo.

Então chega de enrolar e vamos ao código, abra o Visual Studio 2017, e crie uma aplicação do tipo ASP.NET Core Web Application (.NET Core) com o nome WebDemoAutofac e na tela seguinte selecione o template Web API. Agora vamos criar uma interface com o nome ICalculoFrete com o código abaixo:

namespace WebDemoAutofac
{
    public interface ICalculoFrete
    {
        double Calcular(double pesoProdutos, double valorProdutos);
    }
}

Agora vamos criar uma classe que irá implementar nossa interface e terá a regra de cálculo de frete, vamos chamá-la de CalculoFrete, e implementar o código abaixo:

namespace WebDemoAutofac
{
    public class CalculoFrete : ICalculoFrete
    {
        public double Calcular(double pesoProdutos, double valorProdutos) => (valorProdutos * 0.05) + pesoProdutos;
    }
}

De acordo com nossa regra de negócio, o frete custa 5% do valor dos produtos mais o peso dos produtos. Agora que já temos nossa interface e nossa classe de cálculo de frete, vamos adicionar o Autofac em nosso projeto, para substituirmos o container padrão do asp.net. Para isso, abra o console do Nuget e digite:

Install-Package Autofac

E também vamos adicionar mais um pacote do Autofac, para isso digite:

Install-Package Autofac.Extensions.DependencyInjection

Agora que já adicionamos os pacotes do Autofac em nosso projeto, vamos ver como utilizá-lo no lugar do container padrão, e para isso nós precisamos alterar o método ConfigureServices da classe Startup. A primeira alteração que precisamos fazer é alterar o retorno do método, que por padrão é void, e precisamos alterar para retornar um IServiceProvider. Além disso vamos adicionar algumas linhas após o comando services.AddMvc(), conforme abaixo:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
	// Add framework services.
	services.AddMvc();

	var builder = new ContainerBuilder();
	builder.Populate(services);
	builder.RegisterType<CalculoFrete>().As<ICalculoFrete>();
	var container = builder.Build();
	return new AutofacServiceProvider(container);
}

Agora vamos entender o que fizemos. Primeiro de tudo criamos um ContainerBuilder do Autofac:

var builder = new ContainerBuilder();

Depois nós registramos no Autofac os serviços que foram registrados anteriormente no container padrão do asp.net, para isso usamos o método Populate, que irá percorrer tudo que foi registrado na variável services, que é do tipo IServiceCollection, e registrar no Autofac:

builder.Populate(services);

Depois nós registramos a nossa classe CalculoFrete, para ser injetada sempre que alguém pedir pela interface ICalculoFrete, e repare que fizemos o registro utilizando o método RegisterType, que é do Autofac, ou seja, quem já utiliza o Autofac não precisa mudar a forma de registrar seus componentes:

builder.RegisterType<CalculoFrete>().As<ICalculoFrete>();

Depois nós criamos o container do Autofac, a partir do ContainerBuilder que tínhamos:

var container = builder.Build();

E por fim, nós criamos um IServiceProvider a partir do container do Autofac:

return new AutofacServiceProvider(container);

Pronto, nosso projeto já está utilizando o Autofac no lugar do container padrão do asp.net core. Agora, vamos ver ele funcionando na prática, então crie um controller chamado CalculoFreteController com o código abaixo:

using Microsoft.AspNetCore.Mvc;

namespace WebDemoAutofac.Controllers
{
    [Route("api/[controller]")]
    public class CalculoFreteController : Controller
    {
        private readonly ICalculoFrete calculoFrete;

        public CalculoFreteController(ICalculoFrete calculoFrete)
        {
            this.calculoFrete = calculoFrete;
        }

        [HttpGet("{peso}/{valor}")]
        public string Get(double peso, double valor) => $"O valor do frete é {calculoFrete.Calcular(peso, valor)}";
    }
}

O que fizemos foi criar uma variável privada do tipo ICalculoFrete, e receber sua dependência através do construtor do Controller, com isso o Autofac criou uma instância de nossa classe CalculoFrete e nos devolveu para utilizarmos em nosso Controller. E por fim, criamos um método GET que recebe um peso e um valor, e utiliza nossa variável calculoFrete para efetuar o cálculo do frete e retornar a informação para a aplicação cliente. Agora rode a aplicação, e no brower digite:

http://localhost:51558/api/calculofrete/10/100

Não esqueça de trocar a porta 51558 para a porta utilizada em sua aplicação. Ao fazer a requisição para esse endereço, nós receberemos como resposta a mensagem:

O valor do frete é 15

E pronto, nossa aplicação está utilizando o Autofac para injeção de dependências. Trocar o container de injeção de dependência no .net core pode ser útil em algumas situações, pois o container default, apesar de atender a boa parte das aplicações, tem suas limitações, pois ele é feito para atender as necessidades básicas de um container. Dessa forma, você pode precisar de recursos mais avançados, ou mesmo querer fazer a substituição por estar mais acostumado com um determinado container, como por exemplo, o Autofac, que foi o utilizado em nosso exemplo, com isso tudo que você já aprendeu sobre o Autofac aqui no nosso blog, também vale para sua utilização com o .net core.

Eu particularmente gosto bastante do Autofac, pois ele tem uma API simples de utilizar, e é bastante flexível tanto para registrar como para resolver as dependências. Permitir a troca do container foi uma grande jogada da Microsoft, pois nos trouxe comodidade e flexibilidade.

O código-fonte completo do nosso projeto está disponível em meu GitHub: https://github.com/desenvolvedorninja/aspnet-core-com-autofac

 

Quase 20 anos de experiência no mercado de TI.
Atuação em grandes empresas como Netshoes, Borland, JBS, Bradesco, Hospital das Clínicas, Rede, Prodam, HSPE, Instituto Ayrton Senna, e também em empresas internacionais como Delta Dental, T-Mobile, Pepsi e Mckesson.
Fundador da TecPrime Solutions, administrador da comunidade nopCommerce Brasil, e autor dos sites InvestFacil.net e Desenvolvedores.ninja

Facebooktwittergoogle_plusredditpinterestlinkedinmail

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *