From the Dynamic Languages World 2008 in Karlsruhe. This session introduces two powerful techniques which support a clean design of enterprise applications and the implementation of a domain-driven design. In addition to the theoretical background you will learn how to take advantage of AOP and DI in your own projects. The examples given are based on the FLOW3 framework.
Aspect-Oriented Programming and Depedency Injection
1. Robert Lemke | TYPO3 Association
AOP and Dependency Injection
2. Overview
About me, the flow and buzz ...
Unit Testing
Dependency Injection
Aspect-Oriented Programming
AOP and Dependency Injection
3. About me
Robert Lemke, born 27/05/1976
beautiful code evangelist
"chief architect" of TYPO3 5.0 and FLOW3
coffee junkie
married, no children, 1 espresso machine
AOP and Dependency Injection
4. About me HINT
Robert Lemke, born 27/05/1976
beautiful code evangelist
"chief architect" of TYPO3 5.0 and FLOW3
coffee junkie
married, no children, 1 espresso machine
AOP and Dependency Injection
5. About FLOW3
Offspring from the development of TYPO3 5.0
PHP-based enterprise application framework
Enterprise: Information intensive applications with focus on
domain logic
FLOW3 is ready to go, with a default layer architecture, object
management, security etc.
Special support for Domain-Driven Design
AOP and Dependency Injection
6. About the buzz
AOP, DI, DDD, TDD, XP, ... ?
YAGNI ?
IMYLME !
AOP and Dependency Injection
9. Unit Testing
Testing is important (as if you didn't know that)
But not every code can be tested
Dependencies make your developer's life hard
AOP and Dependency Injection
10. Unit Testing
Dependencies
Problem: Classes explicitly refer to other classes:
AOP and Dependency Injection
12. Unit Testing
Dependencies
Unit Testing: You want to test a small unit
You don't want to test
The Simple File Logger
The Card Repository
AOP and Dependency Injection
13. Unit Testing
Dependencies
Unit Testing: You want to test a small unit
You want to test
if the action returns a string representation of the
random card it gets from the repository
AOP and Dependency Injection
14. Dependency Injection
A class doesn't ask for the instance of another class but gets it
injected
This methodology is referred to as the "Hollywood Principle":
"Don't call us, we'll call you"
Enforces loose coupling and high cohesion
Allows you to mock collaborators
Makes you a better programmer
AOP and Dependency Injection
18. Dependency Injection
Component Manager
Manages the whole object lifecycle
Provides so-called "IoC Container"
Components: objects
Components can be configured
AOP and Dependency Injection
19. Dependency Injection
Autowiring
FLOW3 tries to autowire constructor arguments and
arguments of inject* methods
The type of the component to be injected is determined by the
argument type (type hinting)
Autowiring does not work with Setter Injection through regular
setters (set* methods)
Dependencies are only autowired if no argument is passed explicitly
AOP and Dependency Injection
20. Dependency Injection
Component scope
Component objects always live in a certain scope
Currently supported scopes are:
Singleton - Only one instance exists during one script run
Prototype - Multiple instances are possible
AOP and Dependency Injection
21. Dependency Injection
Component scope
The scope can be defined through
an annotation in the component class (recommended)
through the component configuration in a Components.php file
The default scope is "Singleton"
AOP and Dependency Injection
23. Components
Creating Prototypes
Dependency Injection can be used in almost any case, there's no
need to call getComponent()
But what if you need to instantiate a component within a method?
AOP and Dependency Injection
30. Aspect Oriented Programming
PHP's missing features
With AOP you can
centralize and cleanly separate your concerns
intercept any method call
add new behavior to legacy code without touching it
do a lot of dirty tricks
AOP and Dependency Injection
31. Aspect Oriented Programming
Some Vocabulary
Advice
encapsulated code, to be re-used
Joinpoint
places in the code where advice can be applied
Pointcut
identifies set of joinpoints where advice should be applied
Aspect
groups advices and pointcuts
AOP and Dependency Injection
32. The AOP Hello World Classic Demo
Demo
AOP and Dependency Injection
35. Aspect Oriented Programming
Behind the Scenes
Dynamic Proxy Classes
Component Manager delivers the right implementation
Only works if "new" is not used
AOP and Dependency Injection
40. More ...
Known Issues
FLOW3 (or rather PHP) currently causes
Apache crashes - why ever ...
Tests consume a lot of memory
(> 400 MB)
Access is comparably slow even in
Production context (~ 3 req/s) and
needs much memory (~ 20 MB)
Many aspects are work in progress and
neither optimized nor finished
AOP and Dependency Injection