2009-10-29 21 views
8

Ich verwende Dependency Injection in meinem Code (mit Ninject) und dachte, dass es mir recht gut ging, bis ich auf ein Leistungsproblem stieß, das durch ein Missverständnis darüber verursacht wurde, wo DI-Container in Ihren Code passen. Es scheint eine Menge Informationen darüber zu geben, wie DI-Frameworks zu verwenden sind, aber nicht zu sehr, um sie nicht zu benutzen oder wie man sie am besten nutzt (zumindest das könnte ich finden)Dependency Injection Bewährte Methoden

Ich dachte ich würde was ausschreiben Ich denke, es gab einige Best Practices und sehen, ob andere Leute mir zustimmen und welche anderen Best Practices die Leute machen können.

  • Verwenden Sie einen Kernel pro Anwendung oder AppDomain
  • Verwenden Sie den DI-Container für langlebige Singleton-Objekte nur, Verwendung Fabriken (oder andere Methoden) für kurzlebige transiente Objekte)
  • Bevorzugen Constructor Injection über Objekt oder Feldinjektion
  • Objekte anfragen, nicht bauen
  • andere ?? Hinweise auf gute Blog-Artikel/Artikel?
+0

Was ist der Kernel? ist das ein Ninject-spezifisches Konzept (habe es nirgendwo anders gesehen)? – zvolkov

+0

auch die Setzer gegen Konstruktor Injektionen ist ein religiöses Argument und als solches sollte vermieden werden. – zvolkov

Antwort

7

Hier eine kurze Liste der wichtigsten Punkte (von denen einige auch im OP erscheinen):

  • -Code sollte
  • Compose verwendet wird, von denen DI Container (falls vorhanden) nicht bewusst, die gesamte Anwendung in der Wurzel der Anwendung (die Zusammensetzung root)
  • Favor Constructor Injection

ich kann nicht sagen, dass ich mit dem Punkt einig über Singleton vs. Transient-Objekte. Der entscheidende Punkt von DI besteht darin, dass ein externer Mechanismus (z. B. ein DI-Container) die Lebensdauer einer bestimmten Abhängigkeit bestimmt, und nicht eine andere, daher müssen alle Abhängigkeiten vom DI-Container verwaltet werden.

+0

Hallo Mark, siehe die Diskussion hier (http://groups.google.com/group/ninject/browse_thread/thread/41ec03527da9f0f8) über die Leistung von Ninject in Anwendungen. Wie Sie dachte ich, dass der DI-Container überall verwendet werden sollte, aber der Overhead von DI-Containern ist so, dass das Erstellen einer großen Anzahl von transienten Objekten aufdringlich sein kann. Ihr Rat ist vielleicht gut für Web-Anwendungen, aber nicht so sehr in anderen Bereichen. –

+0

Ich überflog diese Diskussion, aber ich denke, ich stimme Nate dort zu. DI sollte verwendet werden, um Abhängigkeiten aufzulösen und einzufügen, aber wenn man Hunderttausende von Objekten über einen DI-Container erstellt, stimmt etwas mit dem Gesamtentwurf nicht. Das war nie die Absicht von DI. Ich hätte meiner Liste einen weiteren Aufzählungspunkt hinzufügen können: "Entkopplung von flüchtigen Abhängigkeiten über stabile Abhängigkeiten", aber es ist eher eine allgemeine Design-Empfehlung als eine bestimmte DI-Sache. –

+2

Ich stimme zu transiente Objekte überein - die meisten Anwendungen, die DI verwenden, erstellen eine große Anzahl von transienten Objekten. Einige Container (Unity und bald Autofac 2) verwenden standardmäßig Transient anstelle von Singleton. Ich glaube nicht, dass "bevorzugen Singletons" könnte als eine Best Practice angesehen werden - es scheint eher wie ein Kommentar auf die Leistung eines bestimmten Container in einem bestimmten Szenario. –

4

Verwenden Sie die DI-Container für Singleton langlebigen nur Objekte, die Verwendung Fabriken (oder andere Methoden) für DI kurzlebig transiente Objekte)

aber verwende die Fabriken in einzuspritzen, wo es erforderlich .