Inversion of Control Containers and the Dependency Injection

http://www.martinfowler.com/articles/injection.htm

Pessoal,

estava lendo o artigo acima sobre IoC. Apesar do autor dizer que os exemplos são simples e óbvios, não entrou na minha cabeça a real utilidade de Dependency Injection.

Fiz uma busca no Forum, vi que o assunto está sendo tratado aqui desde 2002, mas mesmo lendo os posts, não consegui encontrar exemplos reais.

Alguém poderia me indicar alguns exemplos, da utilização prática, no dia a dia?

Obrigado,

Exemplo maaaais do que manjado, mas tambem um dos mais uteis: voce esta escrevendo uma Action para o WebWork, e a sua Action precisa de uma instancia de um Session Bean qualquer, por exemplo, UsuarioFacade.

Num sistema sem uso de IoC/DI, voce faria o lookup do EJB atraves de um service locator (possivelmente singleton), dentro da propria Action ou em alguma classezinha delegada pra fazer isso por voce. Note que aqui, a sua Action disparou o processo de trazer uma instancia do EJB ate ela. Ou seja, a coitada teve que levantar a bunda da cadeira e ir ate a televisao trocar de canal.

Já com IoC/DI, a coisa funciona muito mais como se fosse um controle remoto na mão do seu filhão querido: você diz pra ele que quer ver o jornal, e o moleque poe no canal certo. Num exemplo mais “dia-a-dia” (afinal, eh um pouco incomum ver alguem aqui no guj escrevendo software pra trocar de canal), vejamos como issso ficaria num relacionamento Action-SLSB:

[code]// codigo ligeiramente ficticio, nao compilei

public class AlterarUsuarioAction extends ActionSupport {

private final UsuarioFacade facade;

public AlterarUsuarioAction(UsuarioFacade facade) {
this.facade = facade;
}

// …
}[/code]

Viu soh, nada de service locator, nada de bagunca com JNDI e nem nada… apesar desse exemplo ser soh CDI (Constructor Dependency Injection), acho que nao vale mto a pena citar os outros, mais saiba que existem outras maneiras de injetar dependencias sem necessariamente passar pelo contstrutor (setters, interfaces sao os outros dois, mas nada impede algum xarope de aparecer com mais um qualquer dia desses :)).

A grande sacada aqui foi ter uma interface que deixa a sua Action independente da implementacao do UsuarioFacade. Dai, quando vc estiver escrevendo o diacho do testcase, advinha o que vai acontecer? Voce vai se sentir uma pessoa muuuuuuuuuuuito mais feliz, por isso:

[code]public void testAdicionarUsuarioVestindoCalcasRoxasComBolinhasAmarelas throws Exception {

UsuarioFacade mockFacade = new MockUserFacade();
AlterarUsuarioAction action = new AlterarUsuarioAction(mockFacade);

// … testa o codigo sem se sujar com dependencias :wink:
}[/code]

Agora me diz que o dia nao ficou mais bonito, e o café que a Dona Maria lá do escritório faz não ficou parecendo aquele que vc faz em casa quando quer caprichar na sua dose de cafeína diária? :smiley:

CV,

valeu pela aula!

Qdo vc vier ao RJ, te pago uma cerveja! :slight_smile:

Abraços,
Marco Campelo

Apenas para passar o link correto:

Até.

[quote=“cancao”]Apenas para passar o link correto:


[/quote]

Sorry pelo link quebrado, cortei o L na hora do C&P.

A Brief Introduction to IoC

http://today.java.net/lpt/a/73[/url]