Autofac – injeção através de métodos

Facebooktwittergoogle_plusredditpinterestlinkedinmail

Continuando nossa série sobre Autofac, hoje vamos falar de como fazer a injeção de dependência atráves de métodos. Para isso, vamos usar como base a aplicação de nosso último post, que foi sobre injeção de propriedades. Baixe a aplicação que está disponível no GitHub: https://github.com/desenvolvedorninja/autofac-injecao-propriedade.

Vamos criar um novo método em nossa classe DesenvolvedorNinja, que irá receber dois parâmetros do tipo ILinguagemProgramacao:

public void SetLinguagemProgramacao(ILinguagemProgramacao linguagemProgramacao, ILinguagemProgramacao linguagemProgramacaoSecundaria)
{
    LinguagemProgramacao = linguagemProgramacao;
    LinguagemProgramacaoSecundaria = linguagemProgramacaoSecundaria;
}

Vamos alterar o método do evento Load do form, para passarmos as dependências através do novo método criado:

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

    builder.Register(c =>
    {
        var result = new DesenvolvedorNinja();
        var depPrincipal = c.Resolve<ILinguagemProgramacao>();
        var depSecundaria = c.Resolve<LinguagemGO>();
        result.SetLinguagemProgramacao(depPrincipal, depSecundaria);
        return result;
    }).As<IDesenvolvedor>().InstancePerDependency();

    builder.RegisterType<LinguagemCSharp>().As<ILinguagemProgramacao>().AsSelf().InstancePerDependency();
    builder.RegisterType<LinguagemGO>().AsSelf().InstancePerDependency();
    _container = builder.Build();
}

Veja que através de lambda, nós criamos uma instância de DesenvolvedorNinja, e nós pedimos ao Autofac que instancie nossas dependências, e passamos essas instâncias como parâmetros para nosso método SetLinguagemProgramacao.

Outra forma de fazer a injeção utilizando métodos, é utilizando o evento OnActivating (para saber mais sobre eventos do Autofac, veja nosso post sobre o assunto):

private void FormAutofacDemoWin_Load(object sender, EventArgs e)
{
    var builder = new ContainerBuilder();
    
    builder.RegisterType<DesenvolvedorNinja>().OnActivating(c => {
        var depPrincipal = c.Context.Resolve<ILinguagemProgramacao>();
        var depSecundaria = c.Context.Resolve<LinguagemGO>();
        c.Instance.SetLinguagemProgramacao(depPrincipal, depSecundaria);
    }).As<IDesenvolvedor>().InstancePerDependency();

    builder.RegisterType<LinguagemCSharp>().As<ILinguagemProgramacao>().AsSelf().InstancePerDependency();
    builder.RegisterType<LinguagemGO>().AsSelf().InstancePerDependency();
    _container = builder.Build();
}

Veja que é muito parecido com o que fizemos acima, a diferença é que usamos o evento OnActivating, para através de lambda, definirmos, instanciarmos e chamarmos o método SetLinguagemProgramacao.

Com isso, vemos que o Autofac nos da toda flexibilidade para resolvermos da melhor maneira como vamos injetar nossas dependências em nossas classes, seja utilizando construtores, seja propriedades, ou seja através de métodos.

Eu venho utilizando o Autofac em grandes projetos, e de fato ele é bastante flexível, e graças a essa flexibilidade e facilidade em manipular a forma que registramos nossos componentes e a forma como definimos as injeções de dependência, ele tem atendido todas necessidades dos projetos muito bem,

Como de costume, a aplicação está disponível no GitHub: https://github.com/desenvolvedorninja/autofac-injecao-metodo.

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 *