Frage

Verursacht die Abhängigkeitsinjektion möglicherweise einen großen Overhead?

Ich würde mir das vorstellen, besonders wenn der Resolver mehrmals aufgerufen wird (was sehr wahrscheinlich Musterbeispiele betrachtet)? Oder denke ich falsch? Leider kann ich nicht für mich selbst testen, da ich es nie benutzt habe, sondern geplant habe, es zu verwenden.

War es hilfreich?

Lösung

Es sei denn, Sie verwenden eine Service Locator, Ich bezweifle, dass der Overhead einen signifikanten Unterschied machen wird. (Auch wenn Sie es sind, ist es unwahrscheinlich, dass es signifikant ist.)

Unter Verwendung der Konstruktorinjektion und eines modernen Rahmens wird der Resolver aufgerufen, wenn Objekte konstruiert werden. Zum größten Teil vermute ich, dass Sie feststellen, dass die Objekte mit Abhängigkeiten relativ hochrangige Komponenten, langlebig oder beides sind.

Wenn Sie einen IOC -Behälter verwenden und a erstellen viel von Objekten mit Abhängigkeiten in einer engen Schleife, Sie könnte müssen eine gewisse Optimierung durchführen. Sie können es immer profilieren oder bewerten.

Kurz gesagt, ich würde mich darüber keine Sorgen machen.

Andere Tipps

Die Abhängigkeitsinjektion als Konzept muss keinen hohen Overhead haben: Sie strukturiert einfach eine Klasse, sodass seine Verbindungen zu anderen Klassen zur Laufzeit konstruiert werden können, anstatt im Code fest verdrahtet zu werden.

Natürlich gibt es Möglichkeiten, diese Laufzeitverbindung aufzubauen, die möglicherweise einen hohen Overhead haben. Vermeiden Sie diese Wege.

http://www.codinginstinct.com/2008/04/IOC-Container-Benchmark-unity-windsor.html Für einige Leistungstests. In jedem Test wurden 1000000 Kreationen durchgeführt.

Beachten Sie, dass der Benchmark die Singleton -Auflösung und die vorübergehende Auflösung zeigt: Ein Singleton registriert eine Instanz einer Klasse, EG (mit Unity):

container.RegisterInstance<IMyType>(new ConcreteMyType());

Und diese Instanz wird jedes Mal zurückgegeben (was ziemlich schnell ist).

In einem Transienten werden Sie nur den Klassentyp registrieren, und das IOC -Framework erledigt die Aufgabe, es für Sie zu erstellen, z. B. (in Einheit)

container.RegisterType<IMyType, ConcreteMyType>();

Dies braucht mehr Zeit, um einen Singleton zurückzugeben.

In Bezug auf die Gesamtoptimierung ist der Aufwand der Abhängigkeitsinjektion kleines Bier. Andere Leistungs Engpässe sind eher die Dinge, die man optimieren muss.

Abhängigkeitsspritze an sich ist nur eine einfache Indirektion, also gibt es Overhead, aber es ist in der Tat ziemlich gering. Das Laufzeitmuster -Matching und -auflösen ist eine andere Sache (aber wenn sie oft mit Abhängigkeitsinjektion verwendet wird, ist es nicht so, als ob DI Forderungen Solche Extras ;-).

Die Abhängigkeitsinjektion wird keinen großen Aufwand geben. Ich bin sicher, Sie werden einen Engpass woanders finden. Wenn Sie so viel über Overhead besorgt sind, ist C# nicht die Sprache, die Sie verwenden möchten. Sie verwenden C# für Vorteile, die es mit sich bringt. Es wird einige Details abstrahiert, mit denen Sie sich nicht befassen möchten.

Das Gleiche gilt für DI, es hat auch Vorteile, wie Ihre Anwendung locker gekoppelt zu werden, und das bedeutet, dass es für Sie in Zukunft einfacher ist, sie beizubehalten.

Overhead vs testable und wartbarer Code ... Ich wähle testbare und wartbare Code (Sie können immer einen schnelleren Computer kaufen)

=)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top