Frage

Kann mir jemand erklären, die Vorteile der Verwendung die Standardimplementierung in einen Standard-Konstruktor einen IOC-Container über einfach zu?

Mit anderen Worten, was ist mit diesem Code falsch ist?

public class MyClass
{
    private IMyInterface _myInterface;

    public MyClass()
    {
        _myInterface = new DefaultMyInterface();
    }

    public MyClass(IMyInterface myInterface)
    {
        _myInterface = myInterface;
    }
}

Soweit ich das beurteilen kann, unterstützt diese Klasse Konstruktor Injektion genug, so Unit-Tests und spöttische leicht gemacht werden. Zusätzlich zu dem, den Rechenaufwand des IOC-Container der Standardkonstruktor (nicht zu erwähnen, der gesamte Prozess ist viel transparenter).

entfernt

Die einzigen Vorteile ich sehen kann einen IOC-Container zu verwenden, wenn Sie die Umsetzung Ihrer Schnittstellen häufig wechseln heraus müssen. Bin ich etwas fehlt?

War es hilfreich?

Lösung

Die Idee der IoC ist Teil Ihrer Komponente Funktionalität zu einem anderen Teil des Systems zu delegieren. In IoC Welt haben Sie Komponenten, die umeinander nicht kennen. Ihr Beispiel gegen diese, wie Sie eine enge Kopplung zwischen MyClass und einige Implementierung von IMyInterface sind zu schaffen. Die Hauptidee ist, dass Ihre Komponente keine Kenntnis hat , wie es verwendet wird. In Ihrem Beispiel Ihre Komponente macht einige Annahmen über seine Verwendung.

Eigentlich kann dieser Ansatz funktioniert, aber das Mischen IoC und explizite Objektinitialisierung ist keine gute Praxis IMO.

IoC gibt Ihnen lose Kopplung durch die späte Bindung für den Preis von Code Klarheit durchgeführt wird. Wenn Sie zusätzliche Verhalten dieser Prozess durch, es Dinge noch komplizierter macht und kann zu Fehlern führen, wenn einige Komponenten möglicherweise Objekt mit unerwünschten oder nicht vorhergesagten Verhalten empfangen kann.

Andere Tipps

Wählen Sie eine Seite:)

Kurz IOC empfohlen. Das Problem mit dem Code ist, dass ich nicht ohne neu zu kompilieren den Code die Standardimplementierung der Abhängigkeit auslagern kann, wie Sie am Ende festgestellt haben. IOC können Sie die Konfiguration oder die Zusammensetzung des Objekts in einer externen Datei ohne erneute Kompilierung ändern.
IOC übernimmt die „Konstruktion und Montage“ Verantwortung vom Rest des Codes. Der Zweck des IOC ist nicht Ihr Code testbar zu machen ... es ist ein angenehmer Nebeneffekt. (Genau wie TDDed Code führt zu einem besseren Design)

Es ist nichts falsch mit diesem Code und Sie können es immer noch mit Dependency Injection-Frameworks wie Spring und Guice verwenden.

Viele Entwickler sehen Spring XML-Konfigurationsdatei als Vorteil gegenüber Verdrahtung Abhängigkeiten innerhalb Code, wie Sie Implementierungen, ohne dass ein Kompilierschritt wechseln. Dieser Vorteil ist tatsächlich in Situationen realisiert, wo Sie bereits mehrere Implementierungen in Ihrem Klassenpfad erstellt haben, und Sie wollen die Umsetzung zum Zeitpunkt der Bereitstellung wählen. Sie können eine Situation vorstellen, in der eine Komponente von einem Dritten nach dem Einsatz vorgesehen ist. Ebenso kann ein Fall sein, wenn Sie zusätzliche Implementierungen als Patch nach der Bereitstellung versenden möchten.

Aber nicht alle DI-Frameworks verwenden XML-Konfiguration. Google Guice hat zum Beispiel Module als Java-Klassen geschrieben, die wie jede andere Java-Klasse kompiliert werden müssen.

Was ist der Vorteil von DI, wenn Sie auch eine Zusammenstellung Schritt benötigen? Dies führt uns auf Ihre ursprüngliche Frage zurück. Ich kann folgende Vorteile sehen:

  1. Standard Ansatz DI gesamte Anwendung.
  2. Konfiguration getrennt fein säuberlich von anderer Logik aus.
  3. Möglichkeit Proxies zu injizieren. Frühling zum Beispiel können Sie deklarative Transaktion tun Umgang mit Proxys anstelle der Implementierung Injektion
  4. Einfachere Wiederverwendung von Konfigurationslogik. Wenn Sie DI ausgiebig verwenden, werden Sie ein komplexer Baum von Abhängigkeiten sehen im Laufe der Zeit weiterentwickelt. Verwalten es ohne klar abgetrennt Konfigurationsschicht und Rahmen Unterstützung kann ein Alptraum sein. DI Frameworks machen es einfach, Konfigurationslogik durch Vererbung wiederverwenden und anderen Mitteln.

Die einzige Sorge, die ich habe, ist (1), wenn Ihre Standard-Dienstabhängigkeit selbst hat eine andere / Sekundärdienstabhängigkeit (und so weiter ... Ihr DefaultMyInterface hängt von ILogger) und (2) müssen Sie die erste Dienstabhängigkeit isolieren die zweite (DefaultMyInterface müssen mit einem Stummel ILogger testen). In diesem Fall müssen Sie offenbar den Standard "neue DefaultMyInterface" verlieren und stattdessen tut eines der folgenden: (1) reine Dependency Injection oder (2) Service Locator oder (3) container.BuildUp (neu DefaultMyInterface ());

Einige der Bedenken andere Plakate aufgeführten kann nicht auf Ihre Frage fair sein. Sie wurden nicht über mehrere „Produktion“ Implementierungen zu fragen. Sie fragen nach Unit-Tests Im Falle der Einheit Ihr Ansatz tesing, mit meinem ersten Vorbehalt erwähnt, scheint legitim. Auch ich hielt es in einfachen Einheit Testfall verwendet wird.

Auch ein paar Responder äußerte sich besorgt über repititiousness. Ich mag es nicht repitition auch nicht, aber wenn (1) Ihre Standardimplementierung wirklich ist Ihr Standard (YAGNI: Sie haben keine Pläne auf den Standard zu ändern) und (2) Sie nicht glauben, die erste Einschränkung I angegeben gilt und (3) lieber den einfacheren Code Ansatz, den Sie freigegeben haben, dann denke ich nicht, diese besondere Form der Wiederholung ist ein Problem.

Neben lose Kopplung wird ein IoC Code-Duplizierung reduzieren. Wenn Sie einen IoC verwenden und Sie die Standardimplementierung von Ihrer Schnittstelle zu ändern, müssen Sie es nur ein Ort, an ändern. Wenn Sie Standard contructors verwenden, um die Standardimplementierung zu injizieren, müssen Sie es überall ändern die Schnittstelle verwendet wird.

Zusätzlich zu den anderen Kommentaren, könnte man die DRY argumentieren (Do not Repeat Yourself) Prinzip in diesen Fällen. Es ist redudnant, dass Standard-Bau-Code in jeder Klasse zu setzen zu haben. Es ist introducign auch Sonderfall der Handhabung, wo es braucht daher nicht zu sein.

Ich sehe nicht, warum Sie Ihre Technik die Standardimplementierung von hartzucodieren nicht zusammen mit einem IOC-Container verwendet werden könnten. Just, würden die Abhängigkeiten Sie die Standardimplementierung nicht in der Konfiguration angeben.

Oder bin ich etwas fehlt?

Ein Grund, warum Sie könnten einen IOC-Container verwenden möchten wäre spät Konfiguration der Software zu erleichtern.

Nehmen wir zum Beispiel, bieten Sie mehrere Implementierungen einer bestimmten Schnittstelle -. Den Kunden (oder Ihr Team professionelle Dienstleistungen) können entscheiden, welche man durch Modifikation der IOC-Konfigurationsdatei zu verwenden,

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