Frage

Ich habe den Sprung gewagt und verwenden Guice für mein neuestes Projekt. Insgesamt Eindrücke sind gut, aber ich habe ein Problem getroffen, dass ich meinen Kopf nicht ganz umgehen kann.

Hintergrund: Es ist eine Java6 Anwendung, die Befehle über ein Netzwerk übernimmt, analysiert diese Befehle, und dann verwendet sie einige interne Datenstrukturen zu ändern. Es ist ein Simulator für einige Hardware unserer Firma produziert. Die Änderungen, die ich an die internen Datenstrukturen machen entsprechen den Effekt der Befehle auf der realen Hardware haben, so nachfolgende Abfragen der Datenstrukturen sollten den Hardware-Zustand widerspiegeln zuvor ausgeführten Befehle basieren.

Die Frage, die ich erlebt habe, ist, dass die Befehlsobjekte, diese internen Datenstrukturen zugreifen müssen. Diese Strukturen werden von Guice geschaffen, weil sie werden auf der tatsächlichen Instanz der Hardware emuliert variieren. Die Befehlsobjekte werden nicht von Guice erstellt werden, weil sie im Wesentlichen stumm Objekte. Sie eine Textzeichenfolge akzeptieren, analysieren sie, und eine Methode für die Datenstruktur aufrufen

Die einzige Art, wie ich das alles Arbeit bekommen kann, ist diese Befehlsobjekte haben, indem Guice und in den Datenstrukturen mittels Injektion passiert erstellt werden. Es fühlt sich wirklich klobig und total bläht den Konstruktor der Datenobjekte.

Was habe ich verpasst hier?

War es hilfreich?

Lösung

Dependency Injection funktioniert am besten für die Verkabelung Dienstleistungen. Es kann verwendet werden, um Wertobjekte zu injizieren, aber dies kann ein wenig umständlich sein, besonders wenn diese Objekte wandelbar sind.

Das heißt, Sie Provider und @Provides Methoden verwenden, können Objekte zu binden, die Sie selbst erstellen.

Andere Tipps

Unter der Annahme, dass auf einen Befehl reagiert von der Reaktion auf eine HTTP-Anfrage nicht anders, ich glaube, Sie den richtigen Weg gehen.

Eine häufig verwendete Muster in http-Anwendungen ist die Logik der Anwendung in kurzlebige Objekte zu wickeln, die beide Parameter von der Anfrage haben und einige injiziert Backends. Dazu solches Objekt instanziiert und eine einfache, parameterlos Methode aufrufen, die alle Magie tut.

Vielleicht Bereiche könnte man irgendwie inspirieren? Schauen Sie in Dokumentation und einige Code-Beispiele für die technischen Details zu lesen. In Code sieht es weniger so. Hier ist, wie könnte dies für Ihren Fall arbeiten:

class MyRobot {
   Scope myScope;
   Injector i;       

   public void doCommand(Command c) {
      myScope.seed(Key.get(Command.class), 
      i.getInstance(Handler.class).doSomething();
   }
}


class Handler {
   private final Command c;
   @Inject
   public Handler(Command c, Hardware h) {
     this.c = c;
   }

   public boolean doSomething() {
     h.doCommand(c);
     // or c.modifyState(h) if you want c to access internals of h
   }
}

Stirnrunzeln Einige Leute auf dieser Lösung, aber ich habe diese in mindestens zwei verschiedenen Projekten stark auf Guice in der Vergangenheit unter Berufung in Code zu sehen.

Zugegeben Sie etwas Wertobjekte in der Konstrukteurs injizieren, aber wenn man nicht von ihnen als Wertobjekte denkt, sondern Parameter der Klasse, die es Verhalten ändert es Sinn macht.

Es ist ein wenig umständlich und einige Leute die Stirn runzeln auf Wert Injektion auf diese Weise Objekte, aber ich habe dies in Projekten in der Vergangenheit gesehen, die stark auf Guice für eine Weile verlassen und es hat super funktioniert.

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