Frage

Ist Dependency Injection bedeutet, dass Sie überhaupt nicht über das ‚neue‘ Schlüsselwort müssen? Oder ist es sinnvoll, direkt einfache Blatt-Klassen zu erstellen, wie Sammlungen?

Im Beispiel unten Ich spritze den Komparator, Abfrage und dao, aber die SortedSet direkt instanziiert:

public Iterable<Employee> getRecentHires()
{
    SortedSet<Employee> entries = new TreeSet<Employee>(comparator);
    entries.addAll(employeeDao.findAll(query));
    return entries;
}
War es hilfreich?

Lösung

Nur weil Dependency Injection ein nützliches Muster ist, bedeutet nicht, dass wir für alles verwenden Sie es. Selbst wenn DI verwenden, wird es oft eine Notwendigkeit für neue . Nicht neu löscht nur noch.

Andere Tipps

Ein Weg, ich in der Regel entscheiden, ob oder nicht Dependency Injection zu verwenden ist, ob oder nicht ich brauche die kollaborierenden Klasse zu verspotten oder Stummel, wenn Sie einen Komponententest für die Klasse unter Test zu schreiben. Zum Beispiel, in Ihrem Beispiel Sie (richtig) injizieren die DAO, weil, wenn Sie einen Komponententest für Ihre Klasse schreiben, haben Sie wahrscheinlich alle Daten nicht wollen, um tatsächlich in die Datenbank geschrieben werden. Oder vielleicht eine kollaborierenden Klasse schreibt Dateien auf das Dateisystem oder ist abhängig von einer externen Quelle. Oder das Verhalten unvorhersehbar ist oder schwer Konto bei einem Gerät zu testen. In diesen Fällen ist es am besten, diese Abhängigkeiten zu injizieren.

Für die Klassen wie TreeSet zusammen, würde ich normalerweise nicht diejenigen injizieren, weil es in der Regel nicht erforderlich, wie diese einfache Klassen zu verspotten.

Ein letzter Hinweis: Wenn ein Feld kann aus irgendeinem Grunde nicht injiziert werden, aber ich würde immer noch gerne in einem Test verspotten, ich habe die JUnit-addons PrivateAccessor Klasse hilfreich in der Lage sein die Klasse der privaten Bereich auf ein Mock-Objekt wechseln erstellt von EasyMock (oder JMock oder was auch immer andere Mockframework Sie bevorzugen).

Es ist nichts falsch mit der Verwendung von neue wie, wie es in Ihrem Code-Snippet angezeigt wird.

Nehmen wir den Fall des Wunschs String-Schnipsel anzuhängen. Warum würden Sie den Injektor für einen String fragen wollen?

In einer anderen Situation, die ich konfrontiert habe, brauchte ich einen Thread zu haben, in Übereinstimmung mit dem Lebenszyklus von meinem Behälter läuft. In diesem Fall hatte ich für den Containerstart genannt wurde ein new Thread () , weil mein Injector wurde erstellt, nachdem die Callback-Methode zu tun. Und wenn der Injektor bereit war, Hand ich einige verwaltete Klassen in mein Thema Unterklasse injiziert.

Ja, natürlich.

Dependency Injection ist für Situationen gedacht, in denen es mehrere mögliche Instanziierung Ziele, von denen könnte der Kunde nicht darüber im Klaren sein kann (oder der Lage, eine Wahl zu treffen) der Kompilierung.

Es gibt jedoch genügend Situationen, in denen Sie genau wissen, was Sie instanziiert wollen, so gibt es keine Notwendigkeit für DI.

Das ist wie Funktionen in der objektorientierten langauges Aufruf: nur weil Sie Bindung dynamisch verwenden kann, bedeutet nicht, dass Sie nicht gute alte statische Disposition verwenden können (zum Beispiel, wenn Sie teilen Sie Ihre Methode in mehr privaten Operationen) .

Mein Denken ist, dass DI Drahtschichten super und ist sehr gut und auch Stücke des Codes, die sto flexibel sein, um potenzielle Veränderung braucht. Sicher können wir sagen, alles, was möglicherweise geändert werden müssen, aber wir alle wissen, ein paar Sachen in der Praxis einfach gewohnt berührt werden.

Also, wenn DI ist Overkill verwende ich ‚neuen‘ und lass es einfach rollen.

Ex: für mich ein Modell auf den Blick auf die Controller-Schicht Verdrahtung .. es ist immer über DI getan. Jegliche Algorithmen meine apps verwendet, DI und auch jeden steckbare Reflexions Code, DI. Datenbank-Layer .. DI aber so ziemlich jedes andere Objekt in mein System mit einem gemeinsamen ‚neuen‘ behandelt verwendet wird.

hoffe, das hilft.

Es ist wahr, dass in der heutigen, Rahmen orientierten Umgebung instanziert Objekte immer weniger. Zum Beispiel wird Servlets durch Servlet-Container instanziiert, Bohnen im Frühjahr instanziiert mit Feder usw.

Still, wenn Persistenz-Schicht verwenden, werden Sie Ihre beharrte Objekte instanziiert, bevor sie anhielt wurden. Wenn Hibernate, zum Beispiel werden Sie auf Ihrem beharrte Objekt neu aufrufen, bevor auf Ihrem HibernateTemplate Aufruf speichern.

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