Frage

Total Guice Noob hier, habe ein paar Artikel gelesen und das Intro -Video gesehen, das ist es auch schon.

Hier ist mein vereinfachter alter Code, den ich versuche, "Guicifiy" zu sein. Ich kann nicht ganz herausfinden, wie es ist, da ich (soweit ich verstehe) nur kann @inject-Notieren Sie einen der beiden Konstrukteure? Wie kann eine Anrufklasse die eine oder andere Instanz erstellen? Oder muss ich das irgendwie neu auffüllen?

public class MyDialog extends JDialog {
    public MyDialog( JFrame parent, <other parameters...> ) {
        super( parent );
    }

    public MyDialog( JDialog parent, <other parameters...>) {
        super( parent );
    }
 }
War es hilfreich?

Lösung

Sie können nur in den einen CTOR injizieren.

Je nachdem, wie diese Klasse verwendet wird, könnten Sie:

  • Injizieren Sie eine Fabrik in den Client -Code mit zwei "neuen" Methoden.
  • Rollen Sie alle Argumente in einen CTOR und geben Sie Null, wenn Sie nicht erforderlich sind.

Wie kann eine Anrufklasse die eine oder andere Instanz erstellen?

Dies deutet darauf hin, dass die Anrufklassen mehrere Instanzen von MyDialog haben möchten? Dann müssen Sie eine handgeschnittene Fabrik verwenden (Assisted Inject kann dies für Sie verarbeiten, wenn Sie nur einen CTOR hatten). Ich weiß nicht die Details dessen, was Sie vorhaben, und ich wiederhole wahrscheinlich, was Sie bereits wissen, aber als ausgeblendete Aussage würde ich vorschlagen, auch eine Schnittstelle aus MyDialog zu extrahieren und die Fabrik zurückzugeben. Auf diese Weise können Sie MyDialog in Tests fälschen.

Andere Tipps

Die Konstruktorinjektion ist sehr sauber. MLK hat Recht und sagt, dass Sie nur einen Konstruktor injizieren können.

Was Sie tun können, ist die Methodeninjektion zu verwenden:

public class Smt {

    private int a;
    private Cereal cereal;
    private Personality personality;
    private ignition;

    public Smt() {
        this.a = 5;
    }

    public Smt(int a) {
        this.a = a;
    }

    @Inject
    public void setup(@CiniMini Cereal cereal, @Rastafarian Personality personality,
        Ignition ignition) {
        this.cereal = cereal;
        this.personality = personality;
        this.ignition = ignition;
    }
}

Was Guice tun wird, ist, Ihre Klasse anzurufen. ' setup Klassenmethode und bereitstellen alle Injektionen. Dann tun Sie dasselbe wie im Konstruktor-die Objekte an Ihre Klasse-Attribute angeben.

Ich stimme den vorherigen Kommentaren zu. Nur ein zusätzlicher Hinweis: Die Konstruktorinjektion soll allen Abhängigkeiten einen Klassenbedarf liefern. Wie MLK sagt, könnte ein Ansatz darin bestehen, den Konstruktor mit den meisten Argumenten zu kommentieren und dann den anderen zu neu aufzusetzen, um die ersteren zu bezeichnen, indem sie bei Bedarf Nullwerte übergeben.
Zusätzlich unterstützt Guice 3.0 die sogenannten Konstruktorbindungen Dadurch kann der Programmierer angeben, welcher Konstruktor verwendet werden soll. Sehen hier für mehr Details.

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