php.de

Zurück   php.de > php.de Intern > Off-Topic Diskussionen

Off-Topic Diskussionen Mach mal Pause vom Programmieren!

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 18.05.2006, 10:18  
Gast
 
Beiträge: n/a
Standard [Erledigt] Dependency/Property Injection

Hallo allerseits,

ich habe mal eine Frage an die nicht-java-gurus hier
Es geht um Klassen (Services) welche per XML konfiguriert werden können.
Dazu muss man eine Möglichkeit haben die Konfigurationsdaten (Properties) in diese Klassen einzufügen.
Des weiteren sollen diese Services auch Abhängigkeiten zu anderen Services haben dürfen.

Kleines anschauliches Beispiel:

Service DatabaseConnection: // repräsentiert eine Anbindung an eine Datenbank
Property: connectionURL

Service Irgendwas: // Irgendein Service der Zugriff auf eine Datenbank benötigt.
Dependency: DatabaseConnection

Diese werden so konfiguriert:

Code:
<service name="db" class="DatabaseConnection">
  <property name="connectionURL" url="mysql://localhost/blablubb" />
</service>
<service name="foo" class="Irgendwas">
  <dependency value="db" /> // verwende den obigen service mit dem namen db
</service>
Alles ganz schick soweit, aber das Problem ist das folgende:
Wie werden diese Properties/Dependencies an die Services übergeben?
In Java weit verbreitet ist Setter Injection (Ich probiere den Code mal nach php umzusetzen):
Code:
class Irgendwas
{
    private $db;

    function setDatabaseConnection($db)
    {
        $this->db = $db;
    }
    //usw für jede Dependency bzw Property eine Set Methode. 
}
Oder auch verbreitet: Constructor Injection. Hier werden alle Properties und Dependencies dem Konstruktor übergeben.

Code:
class Irgendwas
{
    private $db;
    function __construct($db)
    {
        $this->db = $db;
    }
}
Und zuletzt das ganze in klassischer form:
Code:
class Irgendwas
{
    private $db;
    function __construct($config)
    {
        $this->db = $config->getDependency("DatabaseConnection");
    }
}
Nun da stehe ich und weiß nicht welche der Techniken ich verwenden soll.

Die letzte Methode ist auf jeden Fall die simpelste und auch intuitivste, da man beim Schreiben eines Service keinerlei Vorgaben im Hinterkopf haben muss und man sich alle Properties/Dependencies per Hand holt.

Aber ich würde gerne wissen inwieweit die ersten beiden Techniken für nicht-java Entwickler nachvollziehbar sind. Da diese erhebliche Vorteile mit sich bringen, ich aber dennoch das Framework so simpel wie möglich halten möchte.

Ich würde mich freuen wenn sich jemand den Roman hier durchlesen könnte ;D
Danke
xardie
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 18.05.2006, 10:52  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

es gibt zwei probleme, die die auswahl der methoden einschränken:

1. das initialisieren muss atomar sein, sonst passieren komische dinge.
nimm nur mal an:

PHP-Code:
$obj = new Obj();
$obj -> setLogger(bar);
$obj -> work(); // braucht eigentlich die datenbank-verbindung.
$obj -> setDatabaseConnection(foo); 
wenn du das nicht garantieren kannst (z.b. durch eine factory-methode,
die das alleinige recht auf das erzeugen neuer instanzen dieses
objekttyps hat), fällt die setter-sache (erste variante) komplett flach.


die zweite methode ist nicht ganz so stabil änderungen gegenüber - eine
neue property und du musst den konstruktor ändern, was impliziert, dass
du jede instanziierung des objekts neu machen musst.

die dritte methode ist die 'sicherste', wenngleich ich dafür plädiere, dass
jede komplexe klasse ihr eigenes config-objekt haben sollte, das mit
settern konfiguriert wird. sonst hat man am ende eine
"gott-konfigurations-klasse" und bringt sie nie wieder los.


PHP-Code:
class FooConfig {
     
   function 
setBla();
   function 
setBli();
   function 
isConfigured(); 
}

class 
Foo {
   function 
__construct(FooConfig $c) {
       if(!
$c -> isConfigured()) {
            throw new 
RuntimeException($c);
      }
  }


alles in allem lässt sich sagen: mit der richtigen factory-methode kannst
du dieses problem vom rest des quellcodes kapseln. wie du die
properties setzt, ist nicht so wichtig, solange du die richtige factory hast.


grüße
axo
axo ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Regex gegen Sql Injection notyyy PHP-Fortgeschrittene 8 20.10.2007 17:57
Sql Injection durchführen? Matthiasnet PHP Tipps 2007 10 21.06.2007 21:16
MySQL injection: mysql_real_escape_string tekknotrip PHP Tipps 2006 5 07.07.2006 11:46
SQL - Injection Stümper Datenbanken 1 30.05.2005 06:36
mysql injection wirkungsvoll verhindern PHP Tipps 2005 4 09.04.2005 18:08
SQL Injection Frage Ypsillon PHP Tipps 2004-2 3 31.12.2004 00:30
Injection / XSS PHP Tipps 2004-2 4 22.11.2004 10:08

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
dependency property, dependencyproperty, php config depndency, dependency properties, php dependency injection, dependencyproperty beispiel, depency property, c dependency property, property injection, dependency properties beispiele, property dependency, ähnlich dependency properties, php setter injection, dependencyproperty injection, php dependency injection without configuration, dependency property anhängen, properties injection jede klasse, java datenbank depency, properties über den konstruktor übergeben, java properties datenbank

Alle Zeitangaben in WEZ +2. Es ist jetzt 13:11 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.