Iniciando com StructureMap

StructureMap é uma biblioteca open-source para fazer Injeção de dependência/ inversão de controle, ela é muito simples de configurar e utilizar, comparada com outras.  Simplificando bem para o que ela pode ser utilizada, ela é utilizada para criar um objeto de uma interface sem conhecer a classe concreta que será utilizada.

Para adicionar a biblioteca pode ser feita pelo Nuget com as versões mais atuais do visual studio ou pode ser feito o download da dll no próprio site da biblioteca.

Dentro da biblioteca a classe mais importante é a ObjectFactory, essa classe é utilizada para configurar qual objeto deve ser criado para qual interface, e quando for necessário retornar um objeto para uma interface ela também é utilizada.

Exemplo

Em uma solução normalmente temos projetos em contexto Web e outros locais(windows services, Console Applications entre outros) que utilizam as mesmas classes, porém é comum ocorrer o problema de dentro de uma dessas classes encontrar um comentários mais ou menos assim “Método deve ser chamado apenas por projetos Web” ou até mesmo diversas condições para que o método pegue as informações de um lugar ou de outro. Isso ocorre com diversas informações mas nesse caso utilizaremos apenas para algumas configurações exatamente para exemplificar.

Primeiro vamos definir o comportamento da nossa interface e uma classe que irá conter as configurações que desejamos buscar. Nossa interface IConfiguracao terá apenas um método chamado PegarConfiguracao que deve retornar uma classe com as configurações do ambiente, como o código abaixo demontra:

public interface IConfigurations
{
 ConfigurationsInfo PegarConfiguracao();
}

public class ConfigurationsInfo
{
 public TipoAmbiente Ambiente { get; set; }
 public string NomeUsuario { get; set; }
}

public enum TipoAmbiente
{
 Local,
 Web
}

Com a interface criada agora deve ser criado as classes concretas para essa interface, nesse caso vamos criar duas WebConfiguration e LocalConfiguration. Uma deverá retornar informações armazenadas na sessão utilizada pelo ASP.Net e a outra deverá retornar informações armazenadas em uma variável estática. A implementação das classe fica assim

public class WebConfiguration : IConfigurations
{
	public ConfigurationsInfo PegarConfiguracao()
	{
		if (HttpContext.Current.Session["NomeUsuario"] == null)
		{
			HttpContext.Current.Session["NomeUsuario"] = "Nome do usuario na Web";
		}
		return new ConfigurationsInfo()
			   {
				   Ambiente = TipoAmbiente.Web,
				   NomeUsuario = HttpContext.Current.Session["NomeUsuario"].ToString()
			   };
	}
}

public class LocalConfiguration : IConfigurations
{
	private static string nomeUsuario;
	public ConfigurationsInfo PegarConfiguracao()
	{
		if (nomeUsuario == null)
		{
			nomeUsuario = "Nome do usuario Local";
		}
		return new ConfigurationsInfo()
			   {
				   Ambiente = TipoAmbiente.Local,
				   NomeUsuario = nomeUsuario
			   };
	}
}

Até agora a unica coisa utilizada foi o básico de orientação a objetos. Agora nos vamos começar com o StructureMap, cria uma classe estática chamada Mapeador(Nome besta exatamente para fixar), essa classe será responsável por fazer a configuração de qual classe concreta deve ser criada para a interface, e também será utilizada para criar um objeto a partir do tipo da interface passada. A configuração será no método chamado Map, dentro dele será chamado o método configure o ObjectFactory, que permite passar a interface e qual o tipo concreto que deve ser criado. O outro método criado será o método Get que irá retornar o objeto a partir da interface. A classe irá ficar assim:

public static class Mapeador
{
	public static void Map()
	{
		
		if (HttpContext.Current == null)
		{
			ObjectFactory.Configure(x =>
			 x.For(typeof(IConfigurations)).Use(typeof(LocalConfiguration)));
		}
		else
		{
			ObjectFactory.Configure(x =>
			 x.For(typeof(IConfigurations)).Use(typeof(WebConfiguration)));
		}

	}

	public static T Get<T>()
	{
		return ObjectFactory.GetInstance<T>();
	}
}

Agora a melhor forma de testar é criar duas aplicações uma Local(no nosso caso será uma console) e uma Web e efetuar a criação o objeto e ver se está funcionando como deve. Primeiro crie uma aplicação console, nela é apenas necessário chamar primeiro o metodo Map da classe Mapeador e depois o Metodo Get. O codigo da aplicação console deve ficar assim:

	Mapeador.Map();
	IConfigurations configurations = Mapeador.Get<IConfigurations>();
	var config = configurations.PegarConfiguracao();
	Console.WriteLine(config.Ambiente + " - Usuario:" + config.NomeUsuario);

	Console.ReadKey();

A unica diferença entre a aplicação console e a aplicação web é o local que deve ser chamado o metodo Map, pois não é uma boa pratica sempre executar o metodo map, isso pode gerar repetição de codigo desnecessário e maior processamento no servidor. O melhor lugar para colocar a configuração é no arquivo Global.asax no metodo Application_Start que irá ser executado apenas quando o site é iniciado.

 

Todo o código deste post está no github neste link.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s