Apresentação realizada no evento Microsoft TechDays 2010 (http://www.techdays2010.com) sobre Inversão de Controlo e Injecção de Dependência na .NET Framework.
2. Caio Proiete
• 10 anos de experiência profissional em TI
• Microsoft Most Valuable Professional
• Microsoft Certified Trainer @ CICLO
• Líder da Comunidade NetPonto
3. Agenda
• Inversão de Controlo (IoC) - Princípio
• Dependency Injection (DI) - Padrão
• Demo
• Unity como container para DI
• Demo
• Outros containers para DI
6. // Magic. Do not touch.
// When I wrote this, only God and I
understood what I was doing
7. // Magic. Do not touch.
// When I wrote this, only God and I
understood what I was doing
// Now, God only knows
8. // Magic. Do not touch.
// When I wrote this, only God and I
understood what I was doing
// Now, God only knows
// somedev1 - 06/07/02 Adding temporary
tracking of Login screen
9. // Magic. Do not touch.
// When I wrote this, only God and I
understood what I was doing
// Now, God only knows
// somedev1 - 06/07/02 Adding temporary
tracking of Login screen
// somedev2 - 05/22/07 Temporary my ass
10. Inversão de Controlo (IoC)
Numa hierarquia, os módulos de nível mais
alto não devem depender directamente dos
módulos de nível mais baixo. Ambos devem
depender de abstrações.
As abstrações não devem depender de
detalhes de implementação, mas os detalhes
devem depender das abstrações.
11. Inversão de Controlo (IoC)
Exemplo (simples) da Violação do Princípio
public class SessoesTechDaysService
{
public IEnumerable<Sessao> ObterSessoesDo(string nomeOrador)
{
var service = new TechDaysDataService();
return service.ObterSessoes()
.Where(s => s.Orador.Nome == nomeOrador)
}
}
12. Inversão de Controlo (IoC)
Exemplo (simples) da Violação do Princípio
public class SessoesTechDaysService
{
public IEnumerable<Sessao> ObterSessoesDo(string nomeOrador)
{
var service = new TechDaysDataService();
return service.ObterSessoes()
.Where(s => s.Orador.Nome == nomeOrador)
}
}
13. Inversão de Controlo (IoC)
Exemplo (simples) da Violação do Princípio
Precisamos abstrair esta dependência.
public class SessoesTechDaysService
{ Dependency Injection FTW :)
public IEnumerable<Sessao> ObterSessoesDo(string nomeOrador)
{
var service = new TechDaysDataService();
return service.ObterSessoes()
.Where(s => s.Orador.Nome == nomeOrador)
}
}
14. Injecção de Dependências (DI)
• Técnica / Padrão de Implementação
• Diferentes Formas de Implementar
• Constructor Injection*
• Setter Injection
• Interface Injection
* mais comum
16. Unity: DI Container
• “Application Block” da Microsoft disponível
no CodePlex
• http://unity.codeplex.com
• Actuamente na versão 2.0.
• Parte integrante da Enterprise Library
• http://entlib.codeplex.com
18. Outros containers para DI
• Autofac
• http://code.google.com/p/autofac
• Castle Windsor
• http://www.castleproject.org/container/index.html
• Ninject
• http://ninject.org
• Spring.NET
• http://www.springframework.net
• StructureMap
• http://structuremap.sourceforge.net
• Lista com mais algumas opções
• http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx
19. Resumo
• Dependency Injection
• Classes independentes umas das outras através
de abstrações.
• Menor impacto para introdução de mudanças e
código mais fácil de testar.
• Diferentes formas de implementar (Constructor,
Setter, Interface, entre outras...
• Normalmente utiliza-se algum tipo de Container
para as dependências. Várias opções disponíveis.