Implementando Capacidades de IOC em Sistemas com Wukong

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.

Tags: IoC dependency injection Wukong design patterns IoC Container

Publicado em 6-20 20:22