aspect-oriented programming and depedency injection
DESCRIPTION
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.TRANSCRIPT
Inspiring people toshareAOP and Dependency Injection
Robert Lemke | TYPO3 Association
AOP and Dependency Injection
Overview
About me, the flow and buzz ...
Unit Testing
Dependency Injection
Aspect-Oriented Programming
AOP and Dependency Injection
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
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
HINTAbout me
AOP and Dependency Injection
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
About the buzz
AOP, DI, DDD, TDD, XP, ... ?
YAGNI ?
IMYLME !
AOP and Dependency Injection
The Demo Package
Demo
AOP and Dependency Injection
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
Unit Testing
Dependencies
Problem: Classes explicitly refer to other classes:
AOP and Dependency Injection
Unit Testing
Dependencies
Try to test this class:
AOP and Dependency Injection
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
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
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
Dependency Injection
Constructor without Dependency Injection
AOP and Dependency Injection
Dependency Injection
Component with Constructor Injection
AOP and Dependency Injection
Dependency Injection
Component with Setter Injection
AOP and Dependency Injection
Dependency Injection
Component Manager
Manages the whole object lifecycle
Provides so-called "IoC Container"
Components: objects
Components can be configured
AOP and Dependency Injection
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
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
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
Components
Component scope
AOP and Dependency Injection
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
Components
Creating Prototypes
Solution A: Call getComponent()
AOP and Dependency Injection
Components
Creating Prototypes
Solution B: Call a factory method
AOP and Dependency Injection
Aspect Oriented Programming
AOP is a programming paradigm
complements OOP by separating concerns to improve modularization
OOP modularizes concerns: methods, classes, packages
AOP addresses cross-cutting concerns
AOP and Dependency Injection
Aspect Oriented Programming
Cross-cutting concerns
Presentation
Domain
Data source
AOP and Dependency Injection
Aspect Oriented Programming
Cross-cutting concerns
Presentation
Domain
Data source
The concerns
live here
AOP and Dependency Injection
Aspect Oriented Programming
Cross-cutting concerns
Some Domain Model
Security
Logging
CONCERNSX-ING
AOP and Dependency Injection
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
Aspect Oriented Programming
AOP and Dependency Injection
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
The AOP Hello World Classic Demo
Demo
AOP and Dependency Injection
Aspect Oriented Programming
Applications for AOP
Logging
Security
Transactions
Persistence
Statistics
In the Domain Layer
AOP and Dependency Injection
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
More ...
AOP and Dependency Injection
More
Where can I get FLOW3?
From our Subversion repository:
https://svn.typo3.org/FLOW3/Distribution/trunk/
AOP and Dependency Injection
More ...
DEV3
AOP and Dependency Injection
More ...
AOP Browser
AOP and Dependency Injection
More ...
Known Issues
FLOW3 (or rather PHP) currently causesApache crashes - why ever ...
Tests consume a lot of memory(> 400 MB)
Access is comparably slow even inProduction context (~ 3 req/s) andneeds much memory (~ 20 MB)
Many aspects are work in progress andneither optimized nor finished
AOP and Dependency Injection
Links
FLOW3 Websitehttp://flow3.typo3.org
TYPO3 Forgehttp://forge.typo3.org
T3CASThttp://typo3.org/podcasts/robert
AOP and Dependency Injection
So long and thanks for the fish
Questions