Wie genau ist das mit dem "per Hand machen" (pure DI) gemeint? Ist das nicht sowas wie
Delphi-Quellcode:
Constructor TX.Create(dep:TY;dep2:TZ);
begin
//init with dep,dep2
end;
Ja, mit dem kleinen unterschied, dass der Konstruktor am besten auch interfaces injected bekommt und nicht Objekte.
Pure DI ist dann das hier:
Delphi-Quellcode:
var
x: IX;
y: IY;
z: IZ;
begin
y := TY.Create(...);
z := TZ.Create(...);
x := TX.Create(y, z);
Und genau das macht ein DI Container auch. Wenn du ein IX haben willst, weiß er, dass er erst ein IY und IZ braucht (also TY und TZ bauen muss, evtl mit deren Abhängigkeiten) und gibt die dann beim Konstruktoraufruf mit.
Ich hab vor einiger Zeit mal nen
Mini DI Container gebaut, der das schon kann - ohne das ganze fancy Extra Zeugs, was der Spring Container kann.
Danke für die Infos,
So hab ich mir das auch vorgestellt.(IY;IZ zu nutzen ist naturlich sehr sinnvoll). Das problem bei dieser Lösung ist nur dass ich bis auf ausnahmen der in einem gemeinsamen
package declarierten Typen nicht so einfach anwenden kann. (Also entweder müsste ich auf statische packages zurück, alle Klassen irgendwo gemeinsame Vorfahren mit
Constructor TBase.Create(a,b,c:iirgendwas);virtual;
haben lassen oder es gibts noch einen anderen weg,über
DLL's
X:=Tx.create(y:ianinterface,z:ianotherinterface)
zu finden und mit Params Y und Z aufzurufen (evtl
RTTI, so wie im o.g beispiel
simple DI container)?
Und genau DAS ist zzt mein problem...ohne parameter ist ja einfach>>Tclass