Este artigo explora como integrar o pacote Wukong para adicionar funcionalidades de contêiner Inversion of Control (IOC) a um sistema. Antes de detalhar o processo de integração, é importante entender o que é IOC e sua relevância, para então compreender como o Wukong pode solucionar problemas comuns.
O Propósito e Significado do IOC
IOC, ou Inversion of Control (Inversão de Controle), também conhecido como Dependency Injection (Injeção de Dependência), é um padrão de design que promove o desacoplamento entre componentes de software. Essencialmente, em vez de um objeto criar suas próprias dependências ou buscá-las ativamente, essas dependências são fornecidas (injetadas) a ele por um framework ou contêiner externo. Isso resulta em sistemas mais flexíveis, fáceis de manter e testar.
1. Abordagem Tradicional para Obtenção de Objetos
Na abordagem tradicional, a criação e o gerenciamento de objetos são explícitos. O código que necessita de um objeto é responsável por instanciá-lo diretamente, criando um acoplamento forte entre as classes.
Pessoa pessoa = new Pessoa();
pessoa.DefinirNome("João");
2. Obtenção de Objetos com um Contêiner IOC
Utilizando um contêiner IOC como o Wukong, o código cliente não precisa mais gerenciar a instanciação. Em vez disso, ele solicita o objeto ao contêiner, que é responsável por criar e fornecer a instância. As dependências entre o contêiner e os objetos são fracamente acopladas, sendo o vínculo real estabelecido apenas no momento da criação da instância.
// Assumindo que Wukong está configurado para resolver 'CodeM.Test.Pessoa'
dynamic pessoa = Wukong.ObterObjeto("CodeM.Test.Pessoa");
pessoa.DefinirNome("João");
Integração do Pacote Wukong
Para adicionar Wukong ao seu projeto, você pode utilizar os seguintes métodos:
1. Gerenciador de Pacotes (NuGet)
Install-Package Wukong -Version 2.0.5
2. .NET CLI
dotnet add package Wukong --version 2.0.5
3. PackageReference (arquivo .csproj)
<PackageReference Include="Wukong" Version="2.0.5" />
4. Paket CLI
paket add Wukong --version 2.0.5
Obtenção de Instâncias de Objetos com Wukong
Wukong oferece duas abordagens principais para recuperar instâncias de objetos: usando o nome completo da classe ou através de configuração.
1. Obtenção por Nome Compelto da Classe
Wukong disponibiliza métodos como ObterObjeto, ObterObjeto<T>, ObterInstanciaUnica e ObterInstanciaUnica<T> para suportar tipos genéricos e o padrão Singleton.
2. Obtenção por Configuração
A abordagem via configuração oferece maior flexibilidade, permitindo extensões e manutenções sem a necessidade de recompilação do sistema. Além disso, possibilita a atribuição de valores a propriedades e inicialização de objetos durante a configuração, suportando também referências entre objetos configurados.
dynamic pessoa = Wukong.ObterObjetoPorId("pessoa");
Para a recuperação de objetos por configuração, Wukong fornece os métodos ObterObjetoPorId, ObterObjetoPorId<T>, ObterInstanciaUnicaPorId e ObterInstanciaUnicaPorId<T>, permitindo a escolha adequada para cada cenário.
Definição de Arquivo de Configuração de Objetos
O arquivo de configuração, em formato XML, permite definir construtores e propriedades de objetos. Tipos de dados comuns, como strings, números, booleanos e datas, são suportados, assim como tipos complexos como enums, listas, arrays e referências a outros objetos.
<?xml version="1.0" encoding="utf-8" ?>
<objetos>
<objeto id="pai" class="Exemplo.Pessoa">
<argumento-construtor>"João"</argumento-construtor>
<argumento-construtor tipo="Exemplo.Sexo">Masculino</argumento-construtor>
</objeto>
<objeto id="mae" class="Exemplo.Pessoa">
<argumento-construtor>"Maria"</argumento-construtor>
<argumento-construtor tipo="Exemplo.Sexo">Feminino</argumento-construtor>
</objeto>
<objeto id="pais">
<argumento-construtor ref="pai"></argumento-construtor>
<argumento-construtor ref="mae"></argumento-construtor>
</objeto>
</objetos>
Consulte a documentação completa no GitHub para regras detalhadas sobre a configuração de objetos.
Como Wukong Localiza os Assembly dos Objetos
A localização dos assemblies onde os objetos estão definidos é um ponto crucial. Wukong emprega duas estratégias:
- Referência explícita aos assemblies: Similar à abordagem tradicional, requer a adição de referências diretas aos pacotes, o que pode levar a um acoplamento forte e prejudicar a extensibilidade. Esta abordagem não é recomendada.
- Posicionamento dos arquivos de assembly: Colocar os arquivos de assembly de terceiros no diretório de execução do sistema ou em um local especificado. Esta é a abordagem recomendada por sua flexibilidade, facilidade de expansão e suporte a atualizações dinâmicas em tempo de execução.
Se os assemblies estiverem no diretório de execução, Wukong os encontrará automaticamente. Caso estejam em um local diferente, é necessário registrar esse caminho usando o método AdicionarCaminhoPesquisa do Wukong.
// Configura o Wukong para procurar definições de objetos no diretório especificado
Wukong.AdicionarCaminhoPesquisa("c:\\libs");
Descrição dos Métodos Comuns
1. Adicionar Caminho de Pesquisa de Assemb (o padrão é o diretório de execução da aplicação)
Definição:
public static void AdicionarCaminhoPesquisa(string caminho)
Parâmetros:
caminho: O caminho absoluto para a pesquisa.
Retorno:
Nenhum.
2. Obter Instância de Objeto pelo Nome Completo da Classe
Definição:
public static object ObterObjeto(string nomeClasseCompleto, params object[] argumentos)
Parâmetros:
nomeClasseCompleto: O nome completo da classe.argumentos: Um array de objetos para os argumentos do construtor.
Retorno:
A instância do objeto criada.
3. Obter Instância de Objeto de um Tipo Específico pelo Nome Completo da Classe
Definição:
public static T ObterObjeto<T>(string nomeClasseCompleto, params object[] argumentos)
Parâmetros:
nomeClasseCompleto: O nome completo da classe.argumentos: Um array de objetos para os argumentos do construtor.
Retorno:
A instância do objeto do tipo especificado.
4. Obter Instância de Objeto pelo Nome Completo da Classe (Padrão Singleton)
Definição:
public static object ObterInstanciaUnica(string nomeClasseCompleto, params object[] argumentos)
Parâmetros:
nomeClasseCompleto: O nome completo da classe.argumentos: Um array de objetos para os argumentos do construtor.
Retorno:
A instância do objeto. Chamadas subsequentes com os mesmos argumentos retornarão a mesma instância.
5. Obter Instância de Objeto de um Tipo Específico pelo Nome Completo da Classe (Padrão Singleton)
Definição:
public static T ObterInstanciaUnica<T>(string nomeClasseCompleto, params object[] argumentos)
Parâmetros:
nomeClasseCompleto: O nome completo da classe.argumentos: Um array de objetos para os argumentos do construtor.
Retorno:
A instância do objeto do tipo especificado. Chamadas subsequentes com os mesmos argumentos retornarão a mesma instância.
6. Obter Instância de Objeto pelo ID de Configuração
Definição:
public static object ObterObjetoPorId(string idObjeto)
Parâmetros:
idObjeto: O ID do objeto definido no arquivo de configuração.
Retorno:
A instância do objeto criada.
7. Obter Instância de Objeto de um Tipo Específico pelo ID de Configuração
Definição:
public static T ObterObjetoPorId<T>(string idObjeto)
Parâmetros:
idObjeto: O ID do objeto definido no arquivo de configuração.
Retorno:
A instância do objeto do tipo especificado.
8. Obter Instância de Objeto pelo ID de Configuração (Padrão Singleton)
Definição:
public static object ObterInstanciaUnicaPorId(string idObjeto)
Parâmetros:
idObjeto: O ID do objeto definido no arquivo de configuração.
Retorno:
A instância do objeto. Chamadas subsequentes retornarão a mesma instância.
9. Obter Instância de Objeto de um Tipo Específico pelo ID de Configuração (Padrão Singleton)
Definição:
public static T ObterInstanciaUnicaPorId<T>(string idObjeto)
Parâmetros:
idObjeto: O ID do objeto definido no arquivo de configuração.
Retorno:
A instância do objeto do tipo especificado. Chamadas subsequentes retornarão a mesma instância.