Guten Abend,
ich habe als Freizeitprojekt einen eigenen Dependency Injection Container entwickelt. Dieser bietet verschiedene Funktionen (Constructor- und Property-Injection mit und ohne Annotationen etc.) an. Dieser Container ermittelt über die Reflection API die Struktur einer Klasse und ermittelt die erforderlichen Abhängigkeiten. Diese werden dann rekursiv injiziert. Das Spiel kennt ihr denke ich sicher. Aktuell stehe ich jedoch vor einer design-technischen Frage, über die ich mir persönlich noch nicht im Klaren bin. Aus diesem Grund möchte ich euch fragen, welche der beiden Varianten, die ich gleich vorstellen werde, ihr bevorzugen würdet - sofern möglich aus dem Bauch heraus, da ihr die Implementierung ja nicht kennt.
Ich möchte diesen automatisierten Prozess von Dependency Injection ein wenig weiter fassen und diesen Prozess flexibel gestalten. Salopp gesagt sollte die Möglichkeit bestehen, diesen Prozess um neue Funktionen erweitern zu können. Das bedeutet: In eine Klasse sollen Abhängigkeiten injiziert werden, die eventuell andere Informationen, andere Zustände und einen anderen Kontext als der "Standard"-Container benötigen. In diesem Sinne bieten sich meiner Meinung nach zwei unterschiedliche Lösungsansätze an.
a) Es kann mehrere unabhängige Dependency Injection Container Implementierungen geben, die in einer bestimmten Reihenfolge (Kette) ausgeführt werden und gemeinsame Informationen teilen.
Struktur:
ContainerChain {ContainerA, ContainerB, ... }
b) Es gibt nur einen Dependency Injection Container, welcher plugin-fähig sein könnte. Hierbei könnten sich Plugins in den Container und die Subkomponenten registrieren und Aufgaben in ihrer eigenen Dömane verrichten.
Struktur:
ContainerA { Plugins: { ConstructorProcessor, PropertyProcessor, ... } }
Für beide Ansätze sprechen nach meinem Dafürhalten verschiedene Vor- und Nachteile. Der Vorteil von der Variante a) ist sicherlich, dass beide Container komplett koexistent sind und sich lediglich einen gemeinsamen Pool an Informationen teilen. Der Nachteil ist jedoch, dass dafür ein zusätzlicher Implementierungsaufwand anfallen wird (was jedoch nicht bedeutet, dass ich diesen nicht in Kauf nehmen würde). Der Vorteil von der Variante b) hingegen liegt darin, dass eine bereits bestehende Implementierung genutzt und erweitert werden kann; demzufolge muss nicht der komplette Stack eventuell neu programmiert werden. Nachteil ist jedoch, dass wahrscheinlich niemals die Flexibilität wie mit der Variante a) geschaffen werden kann.
Spricht denn prinzipiell etwas dagegen, den _einen_ Container plugin-fähig zu gestalten? Ich hoffe, dass meine Frage ausreichend erklärt ist. Ansonsten muss ich ein wenig weiter ausholen. Für Anregungen und Ideen bin ich sehr dankbar.
Gruß, Anyone
ich habe als Freizeitprojekt einen eigenen Dependency Injection Container entwickelt. Dieser bietet verschiedene Funktionen (Constructor- und Property-Injection mit und ohne Annotationen etc.) an. Dieser Container ermittelt über die Reflection API die Struktur einer Klasse und ermittelt die erforderlichen Abhängigkeiten. Diese werden dann rekursiv injiziert. Das Spiel kennt ihr denke ich sicher. Aktuell stehe ich jedoch vor einer design-technischen Frage, über die ich mir persönlich noch nicht im Klaren bin. Aus diesem Grund möchte ich euch fragen, welche der beiden Varianten, die ich gleich vorstellen werde, ihr bevorzugen würdet - sofern möglich aus dem Bauch heraus, da ihr die Implementierung ja nicht kennt.
Ich möchte diesen automatisierten Prozess von Dependency Injection ein wenig weiter fassen und diesen Prozess flexibel gestalten. Salopp gesagt sollte die Möglichkeit bestehen, diesen Prozess um neue Funktionen erweitern zu können. Das bedeutet: In eine Klasse sollen Abhängigkeiten injiziert werden, die eventuell andere Informationen, andere Zustände und einen anderen Kontext als der "Standard"-Container benötigen. In diesem Sinne bieten sich meiner Meinung nach zwei unterschiedliche Lösungsansätze an.
a) Es kann mehrere unabhängige Dependency Injection Container Implementierungen geben, die in einer bestimmten Reihenfolge (Kette) ausgeführt werden und gemeinsame Informationen teilen.
Struktur:
ContainerChain {ContainerA, ContainerB, ... }
b) Es gibt nur einen Dependency Injection Container, welcher plugin-fähig sein könnte. Hierbei könnten sich Plugins in den Container und die Subkomponenten registrieren und Aufgaben in ihrer eigenen Dömane verrichten.
Struktur:
ContainerA { Plugins: { ConstructorProcessor, PropertyProcessor, ... } }
Für beide Ansätze sprechen nach meinem Dafürhalten verschiedene Vor- und Nachteile. Der Vorteil von der Variante a) ist sicherlich, dass beide Container komplett koexistent sind und sich lediglich einen gemeinsamen Pool an Informationen teilen. Der Nachteil ist jedoch, dass dafür ein zusätzlicher Implementierungsaufwand anfallen wird (was jedoch nicht bedeutet, dass ich diesen nicht in Kauf nehmen würde). Der Vorteil von der Variante b) hingegen liegt darin, dass eine bereits bestehende Implementierung genutzt und erweitert werden kann; demzufolge muss nicht der komplette Stack eventuell neu programmiert werden. Nachteil ist jedoch, dass wahrscheinlich niemals die Flexibilität wie mit der Variante a) geschaffen werden kann.
Spricht denn prinzipiell etwas dagegen, den _einen_ Container plugin-fähig zu gestalten? Ich hoffe, dass meine Frage ausreichend erklärt ist. Ansonsten muss ich ein wenig weiter ausholen. Für Anregungen und Ideen bin ich sehr dankbar.
Gruß, Anyone
Kommentar