Ich kenne drei Möglichkeiten, wie Sie Eclipse 4 Objekte in Klassen injizieren:
- Während des Anlaufs der Eclipse-Laufzeit sucht nach entsprechenden Anmerkungen in den Klassen es instanziiert.
- Objekte, die in 1. injiziert wurden, werden nachverfolgt und werden bei Änderung neu injiziert.
- Manuelles Auslösen der Injektion mit ContextInjectionFactory und IEclipseContext.
Was Sie mit der dritten Option möglich kann sein wollen. Here ist ein Code-Beispiel:
ManipulateModelhandler man = new ManipulateModelhandler();
//inject the context into an object
//IEclipseContext iEclipseContext was injected into this class
ContextInjectionFactory.inject(man,iEclipseContext);
man.execute();
Das Problem ist jedoch, dass der IEclipseContext bereits in eine Klasse eingefügt werden muss, die auf das Objekt zugreifen kann, das eine Injektion benötigt. Abhängig von der Anzahl der notwendigen Injektionen kann es sinnvoller sein, Delegierung zu verwenden (Testbarkeit wäre ein Argument).
@Inject
public void setFoo(Foo foo) {
//Bar is not attached to the e4 Application Model
bar.setFoo(foo);
}
Daher ist eine bessere Lösung ist wahrscheinlich mit der @Creatable Anmerkung. Kommentieren Sie einfach Ihre Klasse und geben Sie ihr einen Konstruktor ohne Argumente.
@Creatable
public class Foo {
public Foo() {}
}
Mit @Inject auf diesen Typ wie in der obigen Methode, wird Eclipse instanziieren und injizieren. Der Nachteil ist, dass Sie die Objekt-Erstellung nicht mehr wie mit ContextInjectionFactory.inject (..) steuern können.
Nur ein kleiner Hinweis, dass die meisten Leute vielleicht sehen möchten, einen javax.inject.Provider in die umschließende Klasse zu injizieren, die die injizierten Instanzen als Alternative zu 3 benötigt. –
Wie kann Ich erhalte den 'IEclipseContext', wenn die Anweisung' ContextInjectionFactory.inject (man, iEclipseContext) 'in einer Klasse läuft, die nicht im Application Model definiert ist? – kenshinji
@kenshinji Wahrscheinlich wird diese [Antwort] (https://stackoverflow.com/questions/18316970/how-to-get-the-ieclipsecontext-in-an-activator/33230722#33230722) Ihnen helfen. Es ist jedoch wichtig darauf hinzuweisen, dass dies nicht den Kontext, sondern vielmehr einen Kontext ergibt. Eclipse enthält einen Baum mit Kontextobjekten, und ob einer davon die benötigten Werte enthält, hängt von Ihrem Anwendungsfall ab. Vielleicht sehen Sie sich auch 'E4Application.createDefaultContext()' an. –