Hab das jetzt so zu lösen versucht. Nicht elegant und definitiv ausbaufähig(je nachdem wo man als nächstes gegen eine wand läuft
) //bisher fiel mir keine bessere Lösung ein für das problem, als ein neues interface einzuführen auf das bei erstellung geprüft wird und bei erfolg die enstprechenden abhängigkeiten mitgegeben werden. Man KÖNNTE das dann wohl auch über delegates den einzelen objekten mitgeben, damit die nicht so "hässlich" werden. Die frage bleibt ob das nicht auch einfacher / eleganter geht??
Delphi-Quellcode:
Type
//Nachteil? IInjectable müsste dann von jedem "abhängigen" object implementiert werden (zb auch über delegates)
Iinjectable =
Interface
['
{ECC8E26C-7D14-43FD-9247-066435DAEDA4}']
Procedure Inject(Dependencies:
Array Of Iinterface);
// Function DependsOn(Dependency: Tobject): Boolean;
End;
Tinjectfactory =
Class(Tifactory)
Class
Function New(Classname:
String; Dependencies:
Array Of IInterface)
: Iinterface;
overload;
Static;
End;
//[...]
Class Function Tinjectfactory.New(Classname:
String;
Dependencies:
Array Of IInterface): Iinterface;
Var
Temp: Iinjectable;
Begin
Result :=
{inherited} New(Classname);
//new(param:string)inherited from parent class
Try
If Supports(Result, Iinjectable, Temp)
Then
Temp.Inject(Dependencies);
Except
Raise
End;
End;
//Nutzungsbeispiel
Procedure Tinjecttest.Test_factoryinject;
Var
Parent: Iinterface;
Bla: Ibla;
Begin
Try
Tinjectfactory.
Register([Tinjectabletestobject, Tbla, Tblub]);
Parent := Tinjectfactory.New('
Tinjecttest.Tinjectabletestobject',
[Tbla.Create, Tblub.Create]);
//statt direkterstellung auch zb verschachtelung mehrerer "abhängiger" factoryaufrufe
// assert(iinjectable(parent).dependson())
(Parent
As Ibla).Bla;
(Parent
As Iblub).Blub;
Bla := Parent
As Ibla;
Bla.Bla;
Tinjectfactory.UnRegister([Tinjectabletestobject, Tbla, Tblub]);
Except
On E:
Exception Do
Raise E
End;
End;