ASP .NET MVC 5 -  Usando o StructureMap para injeção de dependência

  Neste artigo vou mostrar como usar a ferramenta StructureMap para realizar a injeção de dependência em uma aplicação ASP .NET MVC 5.

O StructureMap é a ferramenta mais antiga para realizar a injeção de dependência para a plataforma .NET.

Antes de começar vamos recordar alguns conceitos.

Dependency Inversion Principle (DIP)

O DIP nos ajuda a desenvolver um código com baixo acoplamento fazendo com que módulos de alto nível dependam de abstrações e não de implementações concretas de módulos de baixo nível.

Indo direto ao ponto : Dependa de interfaces e não de classe concretas.

O padrão Inversion of Control é uma implementação deste princípio.

Inversion of Control (IoC)

O termo Inversion of Control (Ioc) refere-se a um estilo de programação onde um framework controla o fluxo do programa alterando o controle na sua forma normal.

Dependency Injection (DI)

É um processo de passar os detalhes da abstração para uma entidade

 - A Inversão de controle(Ioc) é um princípio e injeção de dependência(ID) é uma forma de implementar a inversão de controle ou seja: geralmente fazemos a Inversão de controle utilizando a injeção de dependência.

- A DIP é um princípio que nos guia para a DI através da Ioc  ( nossa !!!!)

Recursos usados:

Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.

Criando o projeto no VS Community

Abra o VS 2015 Community e clique em New Project;

Selecione a linguagem Visual C# e o template  ASP .NET Web Applications;

Informe o nome da solução como Mvc_StructureMap e clique no botão OK;

Selecione o template Empty e marque a opção MVC, definindo as opções conforme a figura abaixo e clique no botão OK;

No menu Tools clique em Nuget Package Manager -> Manage Nugect Packages for Solution;

Selecione a biblioteca StructureMap.MVC4 e clique no botão Install;

Ao final teremos os pacotes referenciados no projeto e as seguintes alterações feitas na estrutura do projeto:

Na pasta DependencyResolution o arquivo Ioc.cs é o mais importante.

using StructureMap;
using StructureMap.Graph;
namespace Mvc_StructureMap.DependencyResolution {
    public static class IoC {
        public static IContainer Initialize() {
            ObjectFactory.Initialize(x =>
                        {
                            x.Scan(scan =>
                                    {
                                        scan.TheCallingAssembly();
                                        scan.WithDefaultConventions();
                                    });
            //                x.For<IExample>().Use<Example>();
                        });
            return ObjectFactory.Container;
        }
    }
}

Ao abri-lo, você vai ver um único método de inicialização onde você irá configurar as suas interfaces e os tipos que devem ser usados por eles para esta aplicação.

Não vamos alterar nada neste arquivo.

Fazendo a injeção de dependência com o StructureMap

Para testar a injeção de dependência usando o StructureMap precisamos dos seguintes ingredientes:

Vamos criar uma interface IMensagem na pasta Models do projeto com o código abaixo:

namespace Mvc_StructureMap.Models
{
    public interface IMensagem
    {
        string GetMensagem();
    }
}

Ainda na pasta Models vamos criar a classe concreta Mensagem que implementará esta interface:

namespace Mvc_StructureMap.Models
{
    public class Mensagem : IMensagem
    {
        public string GetMensagem()
        {
            return "Testando a injeção de dependência com o StructureMap";
        }
    }
}

Agora vamos criar o controlador HomeController na pasta Controllers usando o Scaffold MVC 5 Controller Empty:

using Mvc_StructureMap.Models;
using System.Web.Mvc;
namespace Mvc_StructureMap.Controllers
{
    public class HomeController : Controller
    {
        private readonly IMensagem _mensagem;
        public HomeController(IMensagem mensagem)
        {
            _mensagem = mensagem;
        }
        // GET: Home
        public ActionResult Index()
        {
            ViewBag.Mensagem = _mensagem.GetMensagem();
            return View();
        }
    }
}

Neste código vamos fazer a injeção de dependência no controlador usando o construtor.

Precisamos de mais alguma coisa ?

Não. Vamos testar...

Executando o projeto iremos obter o seguinte resultado :

Mas espera aí...

Eu não disse para o StructureMap como resolver a interface IMensagem e assim ele não sabe nada sobre a implementação da classe Mensagem.

Como ele descobriu a implementação e chamou o método GeMensagem() ???

Elementar meu caro...

Na configuração padrão no arquivo Ioc.cs existe a seguinte linha de código :

...
    scan.WithDefaultConventions();
...

Este código irá automaticamente tentar resolver qualquer interface IQualquerCoisa com uma instância do tipo QualquerCoisa, ou seja a classe concreta com o mesmo nome da interface mas sem o prefixo "I".

Essa é a configuração por convenção mas você ainda pode especificar explicitamente os tipos que não seguem esta convenção, mas você ganha tempo usando a configuração padrão.

Exemplo de especificação explicita:

using StructureMap;
using WebApplication1.Controllers;
namespace WebApplication1.DependencyResolution {
    public static class IoC {
        public static IContainer Initialize() {
            ObjectFactory.Initialize(x =>
            {
                x.For<IDependencia>().Use<Dependencia>();
            });
            return ObjectFactory.Container;
        }
    }
}

Pegue o projeto completo aqui :  Mvc_StructureMap.zip (sem as referências)

E ele lhes disse: Na verdade vos digo que ninguém há, que tenha deixado casa, ou pais, ou irmãos, ou mulher, ou filhos, pelo reino de Deus,
Que não haja de receber muito mais neste mundo, e na idade vindoura a vida eterna.
Lucas 18:29,30

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti