9

Ich frage mich, wie ich meine Abhängigkeitsinjektion Container (s) speichern/referenzieren sollte. Ist es in Ordnung, wenn ein Container eine statische Eigenschaft einer statischen Klasse ist? Oder sollte ich den Container eine Instanzvariable in der Anwendung haben? Ich frage mich, was die Vor- und Nachteile jeder Option sind, und was ist die beste Vorgehensweise dafür in Web-, MVC-, Konsolen- und Windows-Apps?Wo sollte ich einen Verweis auf meinen DI-Container speichern?

+0

duplizieren: http://stackoverflow.com/questions/644747/autofac-in-web-applications-where-should-i-store-the-container-for-easy-access http://stackoverflow.com/ Fragen/277438/abstracting-ioc-container-hinter-ein-singleton-doing-it-wrong http://stackoverflow.com/questions/480286/best-practices-for-ioc-container http://stackoverflow.com/ Fragen/367178/Verwendung von ioc-Container-spezifisch-windsor http://StackOverflow.com/Questions/1612682/typical-ioc-Container-usage-Passing-Data-Down-The-Line –

+1

Danke allen! Sorry für alle Duplikate - Ich dachte, das war ein dup, aber war mir nicht sicher, wie ich meine Frage formulieren sollte, um sie zu finden. –

Antwort

5

Ich empfehle, es als Instanzvariable in der Anwendung zu speichern. Durch die Verwendung einer statischen Eigenschaft, die es zu einem global zugänglichen Singleton macht, wird die Abhängigkeit der Anwendung von dieser Eigenschaft ausgeblendet. Dies ist eines der Dinge, die Sie vermeiden möchten, indem Sie zunächst einen Dependency-Container für Abhängigkeiten verwenden!

Wenn das Framework Ihnen den Zugriff auf Ihre Anwendungsinstanz erschwert, wäre es nicht das Ende der Welt, eine statische Variable zu verwenden.

1

Ich stimme Mr. Sternal auf diese. Eine Sache, die zu beachten ist, ist, dass einige DI-Container IDisposable implementieren, sodass Sie den Container wahrscheinlich bei normalem Programmende entfernen möchten. Siehe How do you reconcile IDisposable and IoC?

Beachten Sie auch, dass es oft am besten ist, Streuungsabhängigkeiten vom DI-Container in Ihrer gesamten Anwendung zu vermeiden. Mit anderen Worten, versuchen Sie zu vermeiden, den Container global verfügbar zu machen (Singleton, statische Eigenschaft oder sogar injiziert), um ihn als Service Locator zu verwenden.

Stattdessen können Sie die Fähigkeit des Containers verwenden, Abhängigkeiten von Abhängigkeiten aufzulösen. Sie können beispielsweise den Container beim Start der Anwendung erstellen und ihn zum Konstruieren Ihres Modells (in MVC) verwenden. Das Modell hängt möglicherweise von einem Repository und einem Webdienst ab. Das Repository kann von einer Protokollfunktion abhängen. Der Container löst alle diese Probleme auf, wenn das Modell erstellt wird. Wenn Ihr Modell während des Betriebs Abhängigkeiten erstellen muss, injizieren Sie eine Factory in das Modell.

+1

Einverstanden, und ich mag es, wie ein Poster es in einen der Betrogenen meißelt, die Mauricio ausgegraben hat: "Stellen Sie den IOC-Container auf den höchsten Level/Einstiegspunkt und verwenden Sie ihn, um Abhängigkeiten in alles darunter zu injizieren." (http://stackoverflow.com/questions/480286/best-practices-for-ioc-container) –

+0

@Jeff - Nettes Zitat; einfach und auf den Punkt. Es gibt auch eine ausgezeichnete Antwort von Thorsten Lorenz in diesem Link (auch von Mauricio): http://stackoverflow.com/questions/480286/best-practices-for-ioc-container – TrueWill

+0

Wenn Sie den Container auf den höchsten Stand bringen, Dies führt vermutlich dazu, dass Sie einen Verweis auf Ihre Assembly auf der niedrigsten Ebene benötigen, die eine Injektion erfordert (Datenzugriff möglicherweise). Das ärgert mich ein wenig :( – dougajmcdonald

Verwandte Themen