SlideShare uma empresa Scribd logo
1 de 22
Injeção de
Dependências
Um bom padrão para se começar...
11/2019
Objetivos
▸ Apresentar o conceito de Injeção de Dependências
▸ Explorar a visão sobre os artefatos relacionados à Injeção de Dependências
▸ Promover a reflexão sobre as boas práticas de uso de Injeção de Dependências
2
Apresentação
Formação
▸ Curso Técnico em Processamento de Dados - UNICAMP
▸ Graduação em Publicidade e Propaganda - ISCA
▸ Pós Graduação em Engenharia de Softwares com Métodos Ágeis -
IGTI
3
Vivência Profissional
▸ Sólida experiência em liderança de desenvolvimento de softwares de missão
crítica, responsável por sustentação, desenvolvimento e novos projetos.
▸ Sólidos conhecimentos de arquitetura de software utilizando os paradigmas
de desenvolvimento estruturado (OOP), DDD e micro-serviços, entre outros.
▸ Ampla experiência com ambiente cloud AWS (Amazon Web Services),
satisfazendo questões de resiliência e escalabilidade.
▸ Liderança de equipe DevOps utilizando metodologias ágeis (Scrum/XP),
Kanban e práticas ITIL.
▸ + de 20 anos envolvido com Tecnologia da Informação.
Pessoal
▸ Nascido no Interior Paulista
▸ Casado e pai de 2 filhas
▸ Apaixonado por Tecnologia
▸ Gamer praticante
▸ Apreciador de um bom
churrasco e cerveja gelada =)
Agenda
▸ Injeção de Dependências
▸ Fabricação de Objetos
▸ Inversão de Controle
4
Injeção de
Dependências
Dependency Injection - DI
1
“
Injeção de dependência (“Dependency Injection - DI”) é um
padrão de desenvolvimento (“Design Pattern”) utilizado
para manter baixo o nível de acoplamento na aplicação.
As dependências entre os componentes podem ser
definidas por configuração de infraestrutura (“container”),
que é responsável por "injetar" em cada componente suas
dependências declaradas.
6
7
Classe A - Hello World
class ClassA
{
/**
* Returns Hello "World" or "Name"
* @param string|null $name Any name.
* @return string
*/
public function helloWorld(string $name = null): string
{
$name = (empty($name)) ? "World" : $name;
return "Hello {$name}!" . PHP_EOL;
}
}
class ClassB
{
/**
* Returns Hello Class Name
* @return string
*/
public function helloClass(): string
{
return (new ClassA())->helloWorld(__CLASS__);
}
}
Dependência A - Instanciada
$classB = new ClassB();
echo $classB->helloClass();
// Hello ClassB!
8
Classe A - Hello World
class ClassA
{
/**
* Returns Hello "World" or "Name"
* @param string|null $name Any name.
* @return string
*/
public function helloWorld(string $name = null): string
{
$name = (empty($name)) ? "World" : $name;
return "Hello {$name}!" . PHP_EOL;
}
}
$classB = new ClassB((new ClassA()));
echo $classB->helloClass();
// Hello ClassB!
class ClassB
{
/** @var ClassA */
private $classA;
public function __construct(ClassA $classA)
{
$this->classA = $classA;
}
/**
* Returns Hello Class Name
* @return string
*/
public function helloClass(): string
{
return $this->classA->helloWorld(__CLASS__);
}
}
Dependência A - Injetada
9
Dependência A - Instanciada
class ClassB
{
/**
* Returns Hello Class Name
* @return string
*/
public function helloClass(): string
{
return (new ClassA())->helloWorld(__CLASS__);
}
}
class ClassB
{
/** @var ClassA */
private $classA;
public function __construct(ClassA $classA)
{
$this->classA = $classA;
}
/**
* Returns Hello Class Name
* @return string
*/
public function helloClass(): string
{
return $this->classA->helloWorld(__CLASS__);
}
}
Dependência A - Injetada
Conclusão
10
Ação
▸ Instanciar classes dependentes dentro
de outras classes.
Problemas Gerados
Necessidade de refatoração de todas as
classes que usam a dependência caso:
▸ A assinatura do construtor da classe
dependente for alterada.
▸ A classe dependente for substituída.
Fabricação de
Objetos
Factory | Factory Method
2
“
Fábrica (“Factory”) e Fábrica Dinâmica (“Factory Method”)
são padrões de desenvolvimento (“Design Pattern”)
utilizados para controlar e centralizar a fabricação de
objetos. Sua utilização facilita bastante a adoção de
Injeção de Dependências.
12
13
Classe A - Hello World
class ClassA
{
/**
* Returns Hello "World" or "Name"
* @param string|null $name Any name.
* @return string
*/
public function helloWorld(string $name = null): string
{
$name = (empty($name)) ? "World" : $name;
return "Hello {$name}!" . PHP_EOL;
}
}
class ClassAFactory
{
/**
* Class A Factory
* @return ClassA
*/
public static function factory()
{
return new ClassA();
}
}
$classB = new ClassB(ClassAFactory::factory());
echo $classB->helloClass();
class ClassB
{
/** @var ClassA */
private $classA;
public function __construct(ClassA $classA)
{
$this->classA = $classA;
}
/**
* Returns Hello Class Name
* @return string
*/
public function helloClass(): string
{
return $this->classA->helloWorld(__CLASS__);
}
}
Dependência A - Injetada
14
Classe B - Injetando Classe A
class ClassB
{
/** @var ClassA */
private $classA;
public function __construct(ClassA $classA)
{
$this->classA = $classA;
}
/**
* Returns Hello Class Name
* @return string
*/
public function helloClass(): string
{
return $this->classA->helloWorld(__CLASS__);
}
}
$classB = ClassBFactory::factory();
echo $classB->helloClass();
class ClassBFactory
{
/**
* Class A Factory
* @return ClassB
*/
public static function factory()
{
new ClassB(ClassAFactory::factory());
}
}
Fábrica da Classe B
Conclusão
15
Ação
▸ Alterar o construtor da classe
dependente a ser injetada.
Problemas Gerados
Necessidade de refatoração de todas as
classes que injetam a dependência.
Inversão de
Controle
Inversion of Control - IoC
3
“
Inversão de Controle (“Inversion of Control - IoC”) faz a
inversão da dependência baixando o acoplamento, ou
seja, ao invés da classe principal saber de qual classe
concreta ela depende, ela delega isso para a fábrica, que
retorna a implementação apropriada para aquela
interface. Com isso, passamos a depender de uma
abstração, facilitando a manutenção e evolução da
aplicação.
17
18
Classe N - Usando Interface A
interface ClassAInterface
{
/** … */
public function helloWorld(string $name = null): string;
}
class ClassN implements ClassAInterface
{
/** @inheritDoc */
public function helloWorld(string $name = null): string
{
$name = (empty($name)) ? "World" : $name;
return "Hello {$name}!" . PHP_EOL;
}
}
class ClassAFactory
{
/**
* Class A Factory
* @return ClassAInterface
*/
public static function factory(): ClasseAInterface
{
return new ClassN();
}
}
$classB = ClassBFactory::factory();
echo $classB->helloClass();
class ClassB
{
/** @var ClassAInterface */
private $classA;
public function __construct(ClassAInterface $classA)
{
$this->classA = $classA;
}
/**
* Returns Hello Class Name
* @return string
*/
public function helloClass(): string
{
return $this->classA->helloWorld(__CLASS__);
}
}
Classe B - Dependência de Interface
19
Laravel Service Provider - Conteiner para DI (mapeamento)
use IlluminateSupportServiceProvider;
/**
* Class ClassAServiceProvider
* @package AppProviders
*/
class ClassAServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->app->singleton(ClassAInterface::class, function ($app) {
return new ClassN();
});
}
}
$classA = $this->app->get(ClassAInterface::class).
Conclusão
20
Ação
▸ Alterar a assinatura do construtor ou
alterar a própria classe dependente.
Problemas Gerados
Necessidade de refatoração de todas as
classes que injetam a dependência.
Dúvidas?
21
“A melhor maneira de prever o
futuro é inventá-lo.”
22
Danilo D. de Godoy
▸ Arquiteto, Engenheiro e Coordenador de Software (TI)
▸ danilo.godoy@totalexpress.com.br
▸ https://www.linkedin.com/in/danilodoring/
Alan Kay, cientista da computação, 1971

Mais conteúdo relacionado

Mais procurados

Curso de Java (Parte 3)
 Curso de Java (Parte 3) Curso de Java (Parte 3)
Curso de Java (Parte 3)Mario Sergio
 
As novidades do PHP5 (2005)
As novidades do PHP5 (2005)As novidades do PHP5 (2005)
As novidades do PHP5 (2005)Pablo Dall'Oglio
 
Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013Pablo Dall'Oglio
 
Introdução a Banco de Dados (Parte 3)
Introdução a Banco de Dados (Parte 3)Introdução a Banco de Dados (Parte 3)
Introdução a Banco de Dados (Parte 3)Mario Sergio
 
Java aprendendo linguagem.ppt
Java aprendendo linguagem.pptJava aprendendo linguagem.ppt
Java aprendendo linguagem.pptEmerson Cardoso
 
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...Manuel Menezes de Sequeira
 

Mais procurados (10)

Exercícios PL/SQL
Exercícios PL/SQLExercícios PL/SQL
Exercícios PL/SQL
 
Clean Code
Clean CodeClean Code
Clean Code
 
Doctrine2 Seminário PHP
Doctrine2 Seminário PHPDoctrine2 Seminário PHP
Doctrine2 Seminário PHP
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Curso de Java (Parte 3)
 Curso de Java (Parte 3) Curso de Java (Parte 3)
Curso de Java (Parte 3)
 
As novidades do PHP5 (2005)
As novidades do PHP5 (2005)As novidades do PHP5 (2005)
As novidades do PHP5 (2005)
 
Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013
 
Introdução a Banco de Dados (Parte 3)
Introdução a Banco de Dados (Parte 3)Introdução a Banco de Dados (Parte 3)
Introdução a Banco de Dados (Parte 3)
 
Java aprendendo linguagem.ppt
Java aprendendo linguagem.pptJava aprendendo linguagem.ppt
Java aprendendo linguagem.ppt
 
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...
 

Semelhante a Injeção de Dependências - DI

Novas Funcionalidade no PHP 5.3
Novas Funcionalidade no PHP 5.3Novas Funcionalidade no PHP 5.3
Novas Funcionalidade no PHP 5.3Douglas V. Pasqua
 
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...Manuel Menezes de Sequeira
 
Php5 e a orientação a objetos
Php5 e a orientação a objetosPhp5 e a orientação a objetos
Php5 e a orientação a objetosxbacon
 
Refatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoRefatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoJuciellen Cabrera
 
Introdução a programação II
Introdução a programação IIIntrodução a programação II
Introdução a programação IIClerton Leal
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dadosHenrique Fernandes
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
PDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETPDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETslides_teltools
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Rodrigo Urubatan
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao javaArmando Daniel
 
Jdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITYJdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITYraquelcarsi
 
Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012Luís Cobucci
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitDiego Tremper
 
PHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e ObjetosPHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e ObjetosGeorge Mendonça
 
Fazendo Injeção de dependência com Unity 1.2
Fazendo Injeção de dependência com Unity 1.2Fazendo Injeção de dependência com Unity 1.2
Fazendo Injeção de dependência com Unity 1.2Giovanni Bassi
 

Semelhante a Injeção de Dependências - DI (20)

Novas Funcionalidade no PHP 5.3
Novas Funcionalidade no PHP 5.3Novas Funcionalidade no PHP 5.3
Novas Funcionalidade no PHP 5.3
 
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
 
Php5 e a orientação a objetos
Php5 e a orientação a objetosPhp5 e a orientação a objetos
Php5 e a orientação a objetos
 
Refatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoRefatoração - aquela caprichada no código
Refatoração - aquela caprichada no código
 
Git, GitHub e OO
Git, GitHub e OOGit, GitHub e OO
Git, GitHub e OO
 
Introdução a programação II
Introdução a programação IIIntrodução a programação II
Introdução a programação II
 
Encapsulamento em oo
Encapsulamento em ooEncapsulamento em oo
Encapsulamento em oo
 
Programação Orientada por Objectos - Aula 2
Programação Orientada por Objectos - Aula 2Programação Orientada por Objectos - Aula 2
Programação Orientada por Objectos - Aula 2
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dados
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
PDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETPDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NET
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao java
 
PHP ao Extremo
PHP ao ExtremoPHP ao Extremo
PHP ao Extremo
 
Jdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITYJdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITY
 
Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012
 
Aplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com Django
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnit
 
PHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e ObjetosPHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e Objetos
 
Fazendo Injeção de dependência com Unity 1.2
Fazendo Injeção de dependência com Unity 1.2Fazendo Injeção de dependência com Unity 1.2
Fazendo Injeção de dependência com Unity 1.2
 

Injeção de Dependências - DI

  • 1. Injeção de Dependências Um bom padrão para se começar... 11/2019
  • 2. Objetivos ▸ Apresentar o conceito de Injeção de Dependências ▸ Explorar a visão sobre os artefatos relacionados à Injeção de Dependências ▸ Promover a reflexão sobre as boas práticas de uso de Injeção de Dependências 2
  • 3. Apresentação Formação ▸ Curso Técnico em Processamento de Dados - UNICAMP ▸ Graduação em Publicidade e Propaganda - ISCA ▸ Pós Graduação em Engenharia de Softwares com Métodos Ágeis - IGTI 3 Vivência Profissional ▸ Sólida experiência em liderança de desenvolvimento de softwares de missão crítica, responsável por sustentação, desenvolvimento e novos projetos. ▸ Sólidos conhecimentos de arquitetura de software utilizando os paradigmas de desenvolvimento estruturado (OOP), DDD e micro-serviços, entre outros. ▸ Ampla experiência com ambiente cloud AWS (Amazon Web Services), satisfazendo questões de resiliência e escalabilidade. ▸ Liderança de equipe DevOps utilizando metodologias ágeis (Scrum/XP), Kanban e práticas ITIL. ▸ + de 20 anos envolvido com Tecnologia da Informação. Pessoal ▸ Nascido no Interior Paulista ▸ Casado e pai de 2 filhas ▸ Apaixonado por Tecnologia ▸ Gamer praticante ▸ Apreciador de um bom churrasco e cerveja gelada =)
  • 4. Agenda ▸ Injeção de Dependências ▸ Fabricação de Objetos ▸ Inversão de Controle 4
  • 6. “ Injeção de dependência (“Dependency Injection - DI”) é um padrão de desenvolvimento (“Design Pattern”) utilizado para manter baixo o nível de acoplamento na aplicação. As dependências entre os componentes podem ser definidas por configuração de infraestrutura (“container”), que é responsável por "injetar" em cada componente suas dependências declaradas. 6
  • 7. 7 Classe A - Hello World class ClassA { /** * Returns Hello "World" or "Name" * @param string|null $name Any name. * @return string */ public function helloWorld(string $name = null): string { $name = (empty($name)) ? "World" : $name; return "Hello {$name}!" . PHP_EOL; } } class ClassB { /** * Returns Hello Class Name * @return string */ public function helloClass(): string { return (new ClassA())->helloWorld(__CLASS__); } } Dependência A - Instanciada $classB = new ClassB(); echo $classB->helloClass(); // Hello ClassB!
  • 8. 8 Classe A - Hello World class ClassA { /** * Returns Hello "World" or "Name" * @param string|null $name Any name. * @return string */ public function helloWorld(string $name = null): string { $name = (empty($name)) ? "World" : $name; return "Hello {$name}!" . PHP_EOL; } } $classB = new ClassB((new ClassA())); echo $classB->helloClass(); // Hello ClassB! class ClassB { /** @var ClassA */ private $classA; public function __construct(ClassA $classA) { $this->classA = $classA; } /** * Returns Hello Class Name * @return string */ public function helloClass(): string { return $this->classA->helloWorld(__CLASS__); } } Dependência A - Injetada
  • 9. 9 Dependência A - Instanciada class ClassB { /** * Returns Hello Class Name * @return string */ public function helloClass(): string { return (new ClassA())->helloWorld(__CLASS__); } } class ClassB { /** @var ClassA */ private $classA; public function __construct(ClassA $classA) { $this->classA = $classA; } /** * Returns Hello Class Name * @return string */ public function helloClass(): string { return $this->classA->helloWorld(__CLASS__); } } Dependência A - Injetada
  • 10. Conclusão 10 Ação ▸ Instanciar classes dependentes dentro de outras classes. Problemas Gerados Necessidade de refatoração de todas as classes que usam a dependência caso: ▸ A assinatura do construtor da classe dependente for alterada. ▸ A classe dependente for substituída.
  • 12. “ Fábrica (“Factory”) e Fábrica Dinâmica (“Factory Method”) são padrões de desenvolvimento (“Design Pattern”) utilizados para controlar e centralizar a fabricação de objetos. Sua utilização facilita bastante a adoção de Injeção de Dependências. 12
  • 13. 13 Classe A - Hello World class ClassA { /** * Returns Hello "World" or "Name" * @param string|null $name Any name. * @return string */ public function helloWorld(string $name = null): string { $name = (empty($name)) ? "World" : $name; return "Hello {$name}!" . PHP_EOL; } } class ClassAFactory { /** * Class A Factory * @return ClassA */ public static function factory() { return new ClassA(); } } $classB = new ClassB(ClassAFactory::factory()); echo $classB->helloClass(); class ClassB { /** @var ClassA */ private $classA; public function __construct(ClassA $classA) { $this->classA = $classA; } /** * Returns Hello Class Name * @return string */ public function helloClass(): string { return $this->classA->helloWorld(__CLASS__); } } Dependência A - Injetada
  • 14. 14 Classe B - Injetando Classe A class ClassB { /** @var ClassA */ private $classA; public function __construct(ClassA $classA) { $this->classA = $classA; } /** * Returns Hello Class Name * @return string */ public function helloClass(): string { return $this->classA->helloWorld(__CLASS__); } } $classB = ClassBFactory::factory(); echo $classB->helloClass(); class ClassBFactory { /** * Class A Factory * @return ClassB */ public static function factory() { new ClassB(ClassAFactory::factory()); } } Fábrica da Classe B
  • 15. Conclusão 15 Ação ▸ Alterar o construtor da classe dependente a ser injetada. Problemas Gerados Necessidade de refatoração de todas as classes que injetam a dependência.
  • 17. “ Inversão de Controle (“Inversion of Control - IoC”) faz a inversão da dependência baixando o acoplamento, ou seja, ao invés da classe principal saber de qual classe concreta ela depende, ela delega isso para a fábrica, que retorna a implementação apropriada para aquela interface. Com isso, passamos a depender de uma abstração, facilitando a manutenção e evolução da aplicação. 17
  • 18. 18 Classe N - Usando Interface A interface ClassAInterface { /** … */ public function helloWorld(string $name = null): string; } class ClassN implements ClassAInterface { /** @inheritDoc */ public function helloWorld(string $name = null): string { $name = (empty($name)) ? "World" : $name; return "Hello {$name}!" . PHP_EOL; } } class ClassAFactory { /** * Class A Factory * @return ClassAInterface */ public static function factory(): ClasseAInterface { return new ClassN(); } } $classB = ClassBFactory::factory(); echo $classB->helloClass(); class ClassB { /** @var ClassAInterface */ private $classA; public function __construct(ClassAInterface $classA) { $this->classA = $classA; } /** * Returns Hello Class Name * @return string */ public function helloClass(): string { return $this->classA->helloWorld(__CLASS__); } } Classe B - Dependência de Interface
  • 19. 19 Laravel Service Provider - Conteiner para DI (mapeamento) use IlluminateSupportServiceProvider; /** * Class ClassAServiceProvider * @package AppProviders */ class ClassAServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { $this->app->singleton(ClassAInterface::class, function ($app) { return new ClassN(); }); } } $classA = $this->app->get(ClassAInterface::class).
  • 20. Conclusão 20 Ação ▸ Alterar a assinatura do construtor ou alterar a própria classe dependente. Problemas Gerados Necessidade de refatoração de todas as classes que injetam a dependência.
  • 22. “A melhor maneira de prever o futuro é inventá-lo.” 22 Danilo D. de Godoy ▸ Arquiteto, Engenheiro e Coordenador de Software (TI) ▸ danilo.godoy@totalexpress.com.br ▸ https://www.linkedin.com/in/danilodoring/ Alan Kay, cientista da computação, 1971