Your SlideShare is downloading. ×
0
Dependency Injection ... oder "wie werde ich die       Verwandten los"
DI & IoCSchon mal gehört?
Inversion of Control - IoC• Paradigma aus dem Software Design / Architektur• Widerspricht dem "klassischen" Ansatz "jeder ...
Dependency Injection - DI• Ist ein Entwurfsmuster• Betrachtet Abhängigkeiten zwischen Objekten• Verwendet ein erweitertes ...
Kontrolle? Wer? Wie? Ich?   Mach mal ein Beispiel ... !
So sieht es häufig aus...<?phpclass Foo {  private $oDbConn;    public function __construct() {      $this->oDbConn = new ...
Besser, aber immer noch gruselig...<?phpclass Foo {  private $oDbConn;    private $sDriverClass = MyConfig::getDbClass(); ...
Was läuft da schief?• Die Klasse kümmert sich um das Erzeugen von kritischen  Objekten• Der Klassenname der Abhängigkeit i...
Ok, seh ich ein... aber...DI ist nun so viel besser? Ging bis         jetzt auch ohne ...
Stimmt ...
Hast Du denn bisher schon mal     Tests für Deine App
Wenn ja, hast Du eine solche Klasse schon mal getestet?
Ja?
Haste bestimmt geflucht, oder?
Wäre Dir mit DIwahrscheinlich erspart
Genug der Witze. Wie wende    ich das Muster an?
Zuerst: Was heißt Abhängigkeit?Eine Abhängigkeit äußert sich durch die Referenzierung oderVerwendung einer konkreten Imple...
Welche Arten von "Injection" gibt es?1. Constructor Injection  Instanzen werden über den Konstruktor beim Erstellen der  I...
Schritt 1: Dont do constructor workKonstruktoren sollen nur den ersten Zustand einer Instanzbeschreiben.Schlecht:public fu...
Schritt 2: Design by contractAnstelle der Implementierung sollen Interfaces stehen. DieserSchritt löst die Abhängigkeit zu...
Schritt 3: Weg mit den GlobalsDamit sind sowohl globale Variablen, als auch Singletons inKonstruktoren und Methoden gemein...
Ok, Globals weg ... aber woher        denn sonst?
Bootstrapping
Aufgaben des Bootstrappings• Erzeugung der global benötigten Objekte (z. B. DbConn)• Weiterverteilung der Objekte bei der ...
IoC Container
Was machen IoC Container?• Sie kennen die Abhängigkeiten einer Klasse• Sie erzeugen Instanzen der geforderten Klasse• Sie ...
Verschiedene Ansätze: DeklarativIm Bootstrap einer App wird der Container konfiguriert. Hierbeiwird die Implementierung fü...
Verschiedene Ansätze: AnnotationDieser Ansatz ist in PHP noch recht neu. Eine Klasse wird perDocBlock annotiert.class Foo ...
Verschiedene Ansätze: KonfigurationEine externe Konfigurationsdatei wird verwendet. Hier einBeispiel aus einer FLOW3 YAML ...
Doch Vorsicht!auch der IoC Container ist eine        Abhängigkeit!
Habt ihr Beispiele? Lasst uns drüber reden...
Vielen Dank!
Ein paar LinksBlogartikel über Symfonys DIChttp://usrportage.de/archives/926-Dependency-Injection-Container-Refactorings,-...
Upcoming SlideShare
Loading in...5
×

Dependency injection

5,315

Published on

Meine Slides vom Dependency Injection Pattern Vortrag bei der PHPUG D/DU/KR

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
5,315
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
54
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Transcript of "Dependency injection"

    1. 1. Dependency Injection ... oder "wie werde ich die Verwandten los"
    2. 2. DI & IoCSchon mal gehört?
    3. 3. Inversion of Control - IoC• Paradigma aus dem Software Design / Architektur• Widerspricht dem "klassischen" Ansatz "jeder besorgt sich seine Sachen selbst"• Das Objekt, bzw. die Klasse gibt die Steuerung der Abhängigkeiten aus der Hand• Sog. Hollywood-Prinzip: "Dont call us, we call you"
    4. 4. Dependency Injection - DI• Ist ein Entwurfsmuster• Betrachtet Abhängigkeiten zwischen Objekten• Verwendet ein erweitertes Factory Entwurfsmuster als Basis• Ist eine Anwendung des IoC Paradigmas• Die Anwendung des Musters auf bestehenden Code ist ein Refactoring Prozess• Es gibt Bibliotheken in PHP, die am Ende des Prozesses stehen
    5. 5. Kontrolle? Wer? Wie? Ich? Mach mal ein Beispiel ... !
    6. 6. So sieht es häufig aus...<?phpclass Foo { private $oDbConn; public function __construct() { $this->oDbConn = new MyMysqlDriver(CPATH); }}
    7. 7. Besser, aber immer noch gruselig...<?phpclass Foo { private $oDbConn; private $sDriverClass = MyConfig::getDbClass(); public function __construct() { $this->oDbConn = new $this->sDriverClass(); }}
    8. 8. Was läuft da schief?• Die Klasse kümmert sich um das Erzeugen von kritischen Objekten• Der Klassenname der Abhängigkeit ist fest in der instanzierenden Klasse "verdrahtet"• Selbst beim Auslagern des Klassennamens der Abhängigkeit kümmert sich dennoch die Klasse selbst um die Bereitstellung der Instanz
    9. 9. Ok, seh ich ein... aber...DI ist nun so viel besser? Ging bis jetzt auch ohne ...
    10. 10. Stimmt ...
    11. 11. Hast Du denn bisher schon mal Tests für Deine App
    12. 12. Wenn ja, hast Du eine solche Klasse schon mal getestet?
    13. 13. Ja?
    14. 14. Haste bestimmt geflucht, oder?
    15. 15. Wäre Dir mit DIwahrscheinlich erspart
    16. 16. Genug der Witze. Wie wende ich das Muster an?
    17. 17. Zuerst: Was heißt Abhängigkeit?Eine Abhängigkeit äußert sich durch die Referenzierung oderVerwendung einer konkreten Implementierung in einer Klasse.class FooImpl { public function __construct() { $oVar = new BarImpl(); }}class FooImpl { public function __construct(BarImpl $oParam) { // ... }}
    18. 18. Welche Arten von "Injection" gibt es?1. Constructor Injection Instanzen werden über den Konstruktor beim Erstellen der Instanz übergeben und in der Instanz vorgehalten und / oder weiter durchgereicht.2. Getter / Setter Injection Instanzen werden per setFoo(FooInterface $oFoo) und getFoo() gesetzt und geholt. Man greift nicht mehr auf die Eigenschaft direkt zu, da auch die Beschaffung der Instanz verborgen wird.
    19. 19. Schritt 1: Dont do constructor workKonstruktoren sollen nur den ersten Zustand einer Instanzbeschreiben.Schlecht:public function __construct() { $this->oDb = new DbConnImpl( "localhost", "user", "pass");}Besser:public function __construct(DbConnImpl $oDb) { $this->oDb = $oDb;}
    20. 20. Schritt 2: Design by contractAnstelle der Implementierung sollen Interfaces stehen. DieserSchritt löst die Abhängigkeit zu einer konkretenImplementierung.statt:public function setDbConn(MySQLDbConn $oConn) {}lieber:public function setDbConn(Queryable $oConn) {}=> Vorteil: Theoretisch kann die DB nun auch eine SQLite sein,solang das Interface "Queryable" erfüllt ist.
    21. 21. Schritt 3: Weg mit den GlobalsDamit sind sowohl globale Variablen, als auch Singletons inKonstruktoren und Methoden gemeint!denn:public function __construct() { $this->oVar = DbConn::getInstance();}ist das Gleiche wie:public function __construct() { $this->oVar = $GLOBALS[dbconn];}Es gibt jedoch Ausnahmen, bei denen es Sinn macht einenSingleton einzusetzen!
    22. 22. Ok, Globals weg ... aber woher denn sonst?
    23. 23. Bootstrapping
    24. 24. Aufgaben des Bootstrappings• Erzeugung der global benötigten Objekte (z. B. DbConn)• Weiterverteilung der Objekte bei der Initialisierung des Frameworksz. B. MVC-Framework1. Bootstrap erzeugt DbConn2. Bootstrap erzeugt MVC-Router3. Bootstrap übergibt DbConn an MVC Router4. MVC Router findet passenden Controller5. MVC Router übergibt DbConn an Controller6. Controller erzeugt Service Layer7. Controller übergibt DbConn an Service Layer=> DbConn ist nur ein Mal erzeugt worden!
    25. 25. IoC Container
    26. 26. Was machen IoC Container?• Sie kennen die Abhängigkeiten einer Klasse• Sie erzeugen Instanzen der geforderten Klasse• Sie "konfigurieren" die neue Instanz mit den bekannten Abhängigkeiten• Manche können Abhängigkeitsgraphen auflösen => Klasse A braucht eine Instanz von B => B braucht im Konstruktor eine Instanz von C• Meist erkennen diese dann auch "Circular References" => Wenn C im o. g. Beispiel eine Instanz von A benötigen würde
    27. 27. Verschiedene Ansätze: DeklarativIm Bootstrap einer App wird der Container konfiguriert. Hierbeiwird die Implementierung für ein Interface angegeben.$oCont = Container::getInstance()$oCont->useDep(Queryable, MySqlQueryableImpl);$oCont->manageClass(Foo, aNickName);$oFoo = $oCont->get(aNickName);assert (($oFoo instanceof Foo) === true) &&(($oFoo->getConn() instanceof Queryable) === true)Ein assert auf MySqlQueryableImpl würde ebenfallsfunktionieren, aber gegen das Prinzip verstoßen.
    28. 28. Verschiedene Ansätze: AnnotationDieser Ansatz ist in PHP noch recht neu. Eine Klasse wird perDocBlock annotiert.class Foo { /** * @inject */ public function __construct(Queryable $oConn){ }}$oCont = Container::getInstance();$oCont->setImpl(Queryable, MySQLAdapter);$oFoo = $oCont->get(Foo);
    29. 29. Verschiedene Ansätze: KonfigurationEine externe Konfigurationsdatei wird verwendet. Hier einBeispiel aus einer FLOW3 YAML Konfiguration:F3MyPackageFoo: properties:bar: { object: F3MyPackageBarInterface }$oFoo = Container::getInstance()->get(Foo)
    30. 30. Doch Vorsicht!auch der IoC Container ist eine Abhängigkeit!
    31. 31. Habt ihr Beispiele? Lasst uns drüber reden...
    32. 32. Vielen Dank!
    33. 33. Ein paar LinksBlogartikel über Symfonys DIChttp://usrportage.de/archives/926-Dependency-Injection-Container-Refactorings,-Part-One.htmlMartin Fowler über "Injection"http://martinfowler.com/articles/injection.htmlFlow3 Object Frameworkhttp://flow3.typo3.org/documentation/manuals/flow3/flow3.objectframework/#flow3.objectframework.objectdependencies
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×