So di tre modi di come Eclipse 4 può iniettare oggetti nelle classi:
- Durante l'avviamento il runtime Eclipse sembra per le annotazioni rilevanti nelle classi crea un'istanza.
- Gli oggetti iniettati in 1. sono tracciati e saranno reiniettati se modificati.
- Attivare manualmente l'iniezione utilizzando ContextInjectionFactory e IEclipseContext.
Quello che vuoi è possibile con la terza opzione. Here un esempio di codice:
ManipulateModelhandler man = new ManipulateModelhandler();
//inject the context into an object
//IEclipseContext iEclipseContext was injected into this class
ContextInjectionFactory.inject(man,iEclipseContext);
man.execute();
Il problema è, tuttavia; che IEclipseContext deve già essere iniettato in una classe in grado di accedere all'oggetto che richiede l'iniezione. A seconda del numero di iniezioni necessarie, potrebbe essere più utile utilizzare la delega (la testabilità sarebbe un argomento).
@Inject
public void setFoo(Foo foo) {
//Bar is not attached to the e4 Application Model
bar.setFoo(foo);
}
Pertanto, una soluzione migliore è probabilmente utilizzando l'annotazione @Creatable. Annota semplicemente la tua classe e assegnagli un costruttore senza argomenti.
@Creatable
public class Foo {
public Foo() {}
}
L'uso di @Inject su quel tipo come nel metodo precedente consente a Eclipse di creare un'istanza e di iniettarlo. Lo svantaggio è che non puoi più controllare la creazione dell'oggetto, come faresti con ContextInjectionFactory.inject (..).
fonte
2012-12-25 01:22:59
Solo una piccola nota che molte persone potrebbero voler iniettare un javax.inject.Provider nella classe contenente che richiede le istanze iniettate, in alternativa a 3. –
Come può Ottengo 'IEclipseContext' se l'istruzione' ContextInjectionFactory.inject (man, iEclipseContext) 'è in esecuzione in una classe che non è definita in Application Model? – kenshinji
@kenshinji Probabilmente questa [risposta] (https://stackoverflow.com/questions/18316970/how-to-get-the-ieclipsecontext-in-an-activator/33230722#33230722) ti aiuterà. Ma è importante sottolineare che questo non ti darà il contesto, ma piuttosto il contesto. Eclipse mantiene un albero di oggetti di contesto e, indipendentemente dal fatto che uno di essi contenga i valori necessari, dipende dal tuo caso d'uso. Forse dare un'occhiata a 'E4Application.createDefaultContext()' pure. –