Ich bin ein großer Fan von DI / IOC. Es ist großartig, um harte Abhängigkeiten zu verarbeiten / zu abstrahieren, und erleichtert das Leben ein wenig.
Allerdings habe ich ein kleines Problem damit, das ich nicht sicher bin, wie ich es lösen soll.
Die Grundidee in DI / IOC ist, dass beim Instanziieren eines Objekts alle Abhängigkeiten im Konstruktor vorab ausgefüllt werden.
IMHO gibt es jedoch verschiedene Arten von Parametern für Konstruktoren (insbesondere, wenn Ihre Objekte unveränderlich sind).
- Abhängigkeiten (Objekte, die für die Ausführung Ihres Objekts erforderlich sind)
- Konfiguration (Informationen zur Umgebung, die für die Ausführung der Arbeit erforderlich ist)
- Parameter (Daten, an denen gearbeitet wird)
Ich finde, dass IOC gut mit Abhängigkeiten funktioniert. Aber ich versuche immer noch, den besten Weg zu finden, um mit den anderen beiden umzugehen. Da der Konstruktor jedoch vom IOC-Container ausgeführt werden soll, muss ich diese Elemente anscheinend in den IOC-Container einfügen.
Ich würde gerne wissen, welche Strategien / Muster die Leute anwenden und welche Vor- und Nachteile die Leute gefunden haben.
NB. Mir ist bewusst, dass dies eine sehr subjektive Frage ist, und ich habe versucht, sie gemäß den SE-Richtlinien zu einer "guten" subjektiven Frage zu machen.
I am still trying to work out the best way to deal with the other two
- Übergeben Sie sie als gewöhnliche Parameter an Ihr Objekt?Antworten:
Erstellen Sie eine Konfigurationsklasse (um wählerisch zu sein: eine Schnittstelle + eine Implementierung), die Informationen über die Umgebung bereitstellen soll. Dies unterscheidet die Konfiguration in keiner Weise von anderen Objekten, die für die Ausführung Ihres Objekts erforderlich sind (Punkt 1).
In einer objektorientierten Umgebung können primitive Datentypen in Objekte eingekapselt werden, was auch zu Punkt 1 führt. Aber Sie werden diese SO-Frage wahrscheinlich interessant finden. Sie befasst sich genau mit der Situation primitiver Parameter in einem Konstruktor, wenn ein DI verwendet wird Container. In dem gegebenen Beispiel konnte das Design verbessert werden, wodurch die Notwendigkeit für primitive Typen im Konstruktor vollständig vermieden wurde.
quelle
Was ich tue, ist ein Fabrikmuster für diese Fälle.
Ich verwende das Objekt selbst nicht als Abhängigkeit, sondern erstelle ein Factory-Objekt mit einer Get-Methode, die Parameter akzeptiert, die vom Container nicht automatisch gebunden werden können.
Ex.:
quelle