IoC (veja Inversão de Controle na Wikipedia) é aplicável nos casos em que um componente não pode executar uma tarefa totalmente porque não possui algumas informações ou funcionalidades necessárias.
O exemplo mais simples de um padrão IoC seria as funções de retorno de chamada em C. Por exemplo, você pode declarar a função:
void Iterator(void *list, Func* f)
Qual itera sobre list
aplicando a função f
a cada um de seus itens. A função Iterator
não sabe como cada item será processado, você apenas fornece uma função como um argumento e os processa.
Como mostra o exemplo anterior, o IoC permite separar o seu programa em componentes separados que não se conhecem. Uma das versões mais comuns do IoC é Injeção de Dependentes .
Em Injeção de Dependência cada componente deve declarar uma lista de dependências necessárias para executar sua tarefa. Em tempo de execução, um componente especial (geralmente) chamado de Container IoC executa a vinculação entre esses componentes. Ele tenta fornecer valores para dependências de componente publicadas.
Aqui está um exemplo em pseudo-código:
class Foo
{
<Require Boo>Constructor(Boo boo){ boo.DoSomething }
}
Neste exemplo, a classe Foo
tem um construtor que requer o argumento do tipo Boo
para executar alguma ação.
Você pode criar uma instância da classe Foo
usando um código semelhante a este:
MyContainer.Create(typeof Foo)
MyContainer
- é um Contêiner IoC , que cuida da obtenção da instância de Boo
e passa para o construtor Foo
.
Em resumo, IoC permite separar seu programa em partes separadas. Isso é bom porque:
- Os componentes podem ser facilmente testados de forma independente.
- A complexidade do programa pode ser reduzida.
- Você pode alternar componentes para outra implementação.
No entanto, em alguns casos, IoC pode dificultar a compreensão do código.
Se você quiser ver um bom exemplo do uso real do IoC , dê uma olhada no Mircosoft Bloco de aplicativos da interface do usuário em bloco e CompositeWPF
Espero que minha explicação ajude você.
Cumprimentos,
aku