real world dependency injection - pfcongres 2010
TRANSCRIPT
![Page 1: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/1.jpg)
Real World Dependency InjectionStephan Hochdörfer, bitExpert AG
"Dependency Injection is a key element of agile architecture"
Ward Cunningham
![Page 2: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/2.jpg)
About me
Founder of bitExpert AG, Mannheim
Field of duty Department Manager of Research Labs Head of Development for bitFramework
Focusing on PHP Generative Programming
Contact me @shochdoerfer [email protected]
![Page 3: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/3.jpg)
Agenda
1. What is Dependency Injection?
2. Real World examples
3. Pros & Cons
4. Questions
![Page 4: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/4.jpg)
What is Dependency Injection?
"Dependency Injection is probably one of the most dead simple design pattern [...] but it is also one of the most difficult one to
explain well."Fabien Potencier
![Page 5: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/5.jpg)
What is Dependency Injection?
"Dependency Injection is probably one of the most dead simple design pattern [...] but it is also one of the most difficult one to
explain well."Fabien Potencier
![Page 6: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/6.jpg)
What is Dependency Injection?
What is Dependency Injection?
Popularized by Martin Fowler in 2004
Technique for supplying external dependencies to a component
Main idea: Ask for things, do not look for things!
Three elements Dependant / Consumer Dependencies, e.g. service objects Injector / Container
![Page 7: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/7.jpg)
What is Dependency Injection?
Problems of Dependencies
Code is very tightly coupled Hard to re-use code Hard to test code, no isolation possible
Difficult to maintain What is affected when code changes? Boilerplate configuration code within Business logic
![Page 8: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/8.jpg)
What is Dependency Injection?
Requiredclass
Mainclass
Simple Dependency
![Page 9: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/9.jpg)
What is Dependency Injection?
Requiredclass
Mainclass
Requiredclass
Requiredclass
Complex Dependency
![Page 10: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/10.jpg)
What is Dependency Injection?
Requiredclass
Mainclass
Requiredclass
Requiredclass
Database
Externalresource
Requiredclass
Requiredclass
Webservice
Very complex Dependency
![Page 11: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/11.jpg)
What is Dependency Injection?
Requiredclass
Mainclass
Requiredclass
Requiredclass
Database
Externalresource
Requiredclass
Requiredclass
Webservice
Very complex Dependency
![Page 12: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/12.jpg)
What is Dependency Injection?
Requiredclass
Mainclass
Requiredclass
Requiredclass
Database
Externalresource
Requiredclass
Requiredclass
Webservice
Very complex Dependency
![Page 13: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/13.jpg)
What is Dependency Injection?
How to Manage Dependencies?
![Page 14: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/14.jpg)
What is Dependency Injection?
How to Manage Dependencies?
You don`t need to. The Framework does it all!
![Page 15: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/15.jpg)
What is Dependency Injection?
Types of Dependency Injection
Type 1: Interface injection
<?php
class MySampleService implements IMySampleService, IApplicationContextAware{ /** * @var IApplicationContext */ private $oCtx;
public function setApplicationContext(IApplicationContext $poCtx) {$this->oCtx = $poCtx;
}}?>
![Page 16: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/16.jpg)
What is Dependency Injection?
Types of Dependency Injection
Type 2: Setter injection
<?php
class MySampleService implements IMySampleService { /** * @var ISampleDao */ private $oSampleDao;
public function setSampleDao(ISampleDao $poSampleDao) {$this->oSampleDao = $poSamleDao;
}}?>
![Page 17: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/17.jpg)
What is Dependency Injection?
Types of Dependency Injection
Type 3: Constructor injection
<?php
class MySampleService implements IMySampleService { /** * @var ISampleDao */ private $oSampleDao;
public function __construct(ISampleDao $poSampleDao) {$this->oSampleDao = $poSamleDao;
}}?>
![Page 18: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/18.jpg)
What is Dependency Injection?
Configuration Types
Type 1: Annotations
<?php
class MySampleService implements IMySampleService { /** * @var ISampleDao */ private $oSampleDao;
/** * @Inject */ public function __construct(ISampleDao $poSampleDao) {
$this->oSampleDao = $poSamleDao; }}?>
![Page 19: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/19.jpg)
What is Dependency Injection?
Configuration Types
Type 2: External configuration via XML, JSON, YAML, ...
<?xml version="1.0" encoding="UTF-8" ?><beans xmlns="http://www.bitexpert.de/schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.bitexpert.de/schema/
http://www.bitexpert.de/schema/bitFramework-beans.xsd">
<bean id="SampleDao" class="SampleDao"><constructor-arg value="app_sample" /><constructor-arg value="iSampleId" /><constructor-arg value="BoSample" />
</bean>
<bean id="SampleService" class="MySampleService"><constructor-arg ref="SampleDao" />
</bean></beans>
![Page 20: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/20.jpg)
What is Dependency Injection?
Configuration Types
Type 3: PHP Configuration
<?phpclass BeanCache extends bF_Beanfactory_Container_PHP_ACache {
protected function createSampleDao() {$oBean = new SampleDao('app_sample', 'iSampleId', 'BoSample');return array("oBean" => $oBean, "bSingleton" => "1");
}
protected function createMySampleService() {$oBean = new MySampleService($this->getBean('SampleDao'));return array("oBean" => $oBean, "bSingleton" => "1");
}?>
![Page 21: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/21.jpg)
Agenda
1. What is Dependency Injection?
2. Real World examples
3. Pros & Cons
4. Questions
![Page 22: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/22.jpg)
Real world examples
"High-level modules should not depend on low-level modules. Both should depend on abstractions."
Robert C. Martin
![Page 23: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/23.jpg)
Real World examples
Unittesting made easy
<?phprequire_once 'PHPUnit/Framework.php';
class ServiceTest extends PHPUnit_Framework_TestCase { public function testSampleService() { $oSampleDao = $this->getMock('ISampleDao');
// run test case$oService = new MySampleService($oSampleDao);$bReturn = $oService->doWork();
// check assertions$this->assertTrue($bReturn);
}}?>
![Page 24: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/24.jpg)
Real World examples
One class, multiple configurations
<?xml version="1.0" encoding="UTF-8" ?><beans xmlns="http://www.bitexpert.de/schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.bitexpert.de/schema/
http://www.bitexpert.de/schema/bitFramework-beans.xsd">
<bean id="ExportLive" class="MyApp_Service_ExportManager"><constructor-arg ref="DAOPageLive" />
</bean>
<bean id="ExportWorking" class="MyApp_Service_ExportManager"><constructor-arg ref="DAOPageWorking" />
</bean>
</beans>
Implementation
Live Working
![Page 25: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/25.jpg)
Real World examples
Mocking external services
Connector WebserviceConsumer
<?xml version="1.0" encoding="UTF-8" ?><beans xmlns="http://www.bitexpert.de/schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.bitexpert.de/schema/
http://www.bitexpert.de/schema/bitFramework-beans.xsd">
<bean id="Consumer" class="MyApp_Service_Consumer"><constructor-arg ref="Connector" />
</bean>
</beans>
IConnector interface
![Page 26: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/26.jpg)
Real World examples
Mocking external services
alternativeConnector
Localfilesystem
Consumer
<?xml version="1.0" encoding="UTF-8" ?><beans xmlns="http://www.bitexpert.de/schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.bitexpert.de/schema/
http://www.bitexpert.de/schema/bitFramework-beans.xsd">
<bean id="Consumer" class="MyApp_Service_Consumer"><constructor-arg ref="AltConnector" />
</bean>
</beans>
IConnector interface
![Page 27: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/27.jpg)
Real World examples
Clean, readable code
<?php
class Promio_Action_News_Delete extends bF_Mvc_Action_AAction {/** * @var Promio_Service_INewsManager */private $oNewsManager;
public function __construct(Promio_Service_INewsManager $poNewsManager) {$this->oNewsManager = $poNewsManager;
}
protected function execute(bF_Mvc_Request $poRequest) {try {
$this->oNewsManager->delete((int) $poRequest->getVar('iNewsId'));}catch(bF_Service_ServiceException $oException) {}
$oMaV = new bF_Mvc_ModelAndView($this->getSuccessView(), true);return $oMaV;
}}?>
![Page 28: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/28.jpg)
Real World examples
No framework dependency
<?php
class MySampleService implements IMySampleService { /** * @var ISampleDao */ private $oSampleDao;
public function __construct(ISampleDao $poSampleDao) {$this->oSampleDao = $poSamleDao;
}
public function getSample($piSampleId) {try { return $this->oSampleDao->readByPrimaryKey((int) $piSampleId);}catch(DaoException $oException) {}
}}?>
![Page 29: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/29.jpg)
Real World examples
Cache, Cache, Cache!
XML no Caching XML with Caching PHP PHP compiled
0
20
40
60
80
100
120
140
160
180
Requests per Second meassured via Apache HTTP server benchmarking tool
![Page 30: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/30.jpg)
Agenda
1. What is Dependency Injection?
2. Real World Examples
3. Pros & Cons
4. Questions
![Page 31: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/31.jpg)
Pros & Cons
Benefits
Good for agile development Reducing amount of code Helpful for Unit testing
Loose coupling Least intrusive mechanism Switching implementations by changing configuration
Clean view on the code Separate configuration from code Getting rid of boilerpate configuration code
![Page 32: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/32.jpg)
Pros & Cons
Cons
To many different implementations, no standard today! Bucket, Crafty, FLOW3, Imind_Context, PicoContainer,
Pimple, Phemto, Stubbles, Symfony 2.0, Sphicy, Solar, Substrate, XJConf, Yadif, Zend_Di (Proposal), Lion Framework, Spiral Framework, Xyster Framework, …
No JSR 330 for PHP
Simple Containers vs. fully-stacked Framework No dependency from application to Container!
Developers need to be aware of configuration runtime↔
![Page 33: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/33.jpg)
Agenda
1. What is Dependency Injection?
2. Pros & Cons
3. Real World examples
4. Questions
![Page 34: Real World Dependency Injection - PFCongres 2010](https://reader035.vdocument.in/reader035/viewer/2022062418/5562ec13d8b42a213b8b4c08/html5/thumbnails/34.jpg)