Autofac – injeção de propriedades

Facebooktwittergoogle_plusredditpinterestlinkedinmail

Hoje vamos seguir nossa série sobre o Autofac, e vamos ver como fazer a injeção de dependência através de propriedades, uma alternativa à injeção através de construtores. Para nosso exemplo de hoje, vamos usar como base a aplicação que fizemos no post sobre injeção via construtores que pode ser encontrada no GitHub: https://github.com/rdakar/autofac-injecao-via-construtor.

Para começar, abra o projeto, e altere a classe DesenvolvedorNinja, retirando a injeção via construtor, e transformando a variável privada _linguagemProgramacao em uma propriedade:

namespace AutofacDemoWin
{
    public class DesenvolvedorNinja : IDesenvolvedor
    {
        public ILinguagemProgramacao LinguagemProgramacao { get; set; }

        public DesenvolvedorNinja()
        {
            
        }

        public string GetLinguagemProgramacao()
        {
            return LinguagemProgramacao.Nome;
        }
    }
}

Com isso, o evento buttonObterLinguagemDefault_Click, remova esse evento e o botão ObterLinguagemDeafult. Vamos deixar apenas o botão que utiliza o Autofac para criação dos objetos. Agora vamos alterar o código responsável pelo registro de nossas classes, para dizermos ao Autofac que queremos fazer a injeção através de propriedades:

private void FormAutofacDemoWin_Load(object sender, EventArgs e)
{
    var builder = new ContainerBuilder();
    builder.RegisterType<DesenvolvedorNinja>().As<IDesenvolvedor>().PropertiesAutowired().InstancePerDependency();
    builder.RegisterType<LinguagemCSharp>().As<ILinguagemProgramacao>().InstancePerDependency();
    _container = builder.Build();
}

O que fizemos foi apenas adicionar a chamada para o método PropertiesAutowired, no registro de nossa classe DesenvolvedorNinja. Pronto, rode a aplicação e veja o resultado. O Autofac vai injetar uma instância de LinguagemCSharp na nossa propriedade LinguagemProgramacao.

O Autofac nos permite também definir valores específicos para as propriedades que quisermos, por exemplo, vamos alterar a classe DesenvolvedorNinja e criar uma outra propriedade do tipo ILinguagemProgramacao:

public ILinguagemProgramacao LinguagemProgramacaoSecundaria { get; set; }

E vamos alterar o método GetLinguagemProgramacao para ficar dessa forma:

public string GetLinguagemProgramacao() => $"Linguagem principal: {LinguagemProgramacao.Nome} - Linguagem secundáriaa: {LinguagemProgramacaoSecundaria.Nome}";

Agora vamos criar uma nova classe, chamada LinguagemGO

namespace AutofacDemoWin
{
    public class LinguagemGO : ILinguagemProgramacao
    {
        public string Nome => "GO";

        public double Versao => 1.5;
    }
}

Agora, vamos ver como falamos para o Autofac, que para a propriedade LinguagemProgramacaoSecundaria nós queremos que ele injete a classe LinguagemGO. Voltamos para o código do evento Load do nosso Form, e vamos deixar o código assim:

private void FormAutofacDemoWin_Load(object sender, EventArgs e)
{
    var builder = new ContainerBuilder();

    NamedPropertyParameter paramLinguagemPrincipal = new NamedPropertyParameter("LinguagemProgramacao", new LinguagemCSharp());
    NamedPropertyParameter paramLinguagemSecundaria = new NamedPropertyParameter("LinguagemProgramacaoSecundaria", new LinguagemGO());

    builder.RegisterType<DesenvolvedorNinja>().As<IDesenvolvedor>().WithProperties(new List<Parameter>() { paramLinguagemPrincipal, paramLinguagemSecundaria }).InstancePerDependency();
    builder.RegisterType<LinguagemCSharp>().As<ILinguagemProgramacao>().InstancePerDependency();
    _container = builder.Build();
}

O que temos de diferente, nós retiramos o método PropertiesAutowired e colocamos o método WithProperties, que recebe uma lista da classe Parameter do Autofac. Nós passamos para essa lista, dois parâmetros, sendo um para cada uma de nossas propriedades, sendo que em cada uma, instânciamos a classe adequada. Rode a aplicação e veja o resultado.

A outra forma de trabalharmos com propriedades, é usando lambda, o que deixaria nosso método assim:

private void FormAutofacDemoWin_Load(object sender, EventArgs e)
{
    var builder = new ContainerBuilder();
    builder.Register(c => new DesenvolvedorNinja { LinguagemProgramacao = c.Resolve<ILinguagemProgramacao>(), LinguagemProgramacaoSecundaria = new LinguagemGO() }).As<IDesenvolvedor>().InstancePerDependency();
    builder.RegisterType<LinguagemCSharp>().As<ILinguagemProgramacao>().AsSelf().InstancePerDependency();
    _container = builder.Build();
}

Na minha opinião, essa forma é mais prática do que nomeando propriedades, principalmente quando você tem mais de uma, e como pode reparar, é bastante flexível, veja que uma propriedade estou injetando usando o próprio Autofac, e a outra estou chamando o construtor manualmente.

O código está disponível no GitHub: https://github.com/rdakar/autofac-injecao-propriedade.

O próximo post da série do Autofac, será sobre a injeção através de métodos, não perca.

Facebooktwittergoogle_plusredditpinterestlinkedinmail

1 thought on “Autofac – injeção de propriedades

Deixe uma resposta

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