2012-12-24 11 views
9

Ho creato un servizio OSGI con servizi dichiarativi per iniettare un oggetto che implementa un'interfaccia. Se inserisco l'oggetto in una classe collegata al modello dell'applicazione (gestore, parte, ....) funziona correttamente. Se lo inserisco in una classe che non è collegata al modello dell'applicazione, restituisce sempre null.Come usare eclipse 4 DI in classi che non sono collegate al modello di applicazione?

È possibile utilizzare DI in classi non associate al modello di applicazione? Ho guardato i tutorial in vogella ma in qualche modo non trovo una soluzione.

risposta

6

So di tre modi di come Eclipse 4 può iniettare oggetti nelle classi:

  1. Durante l'avviamento il runtime Eclipse sembra per le annotazioni rilevanti nelle classi crea un'istanza.
  2. Gli oggetti iniettati in 1. sono tracciati e saranno reiniettati se modificati.
  3. 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 (..).

+0

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. –

+1

Come può Ottengo 'IEclipseContext' se l'istruzione' ContextInjectionFactory.inject (man, iEclipseContext) 'è in esecuzione in una classe che non è definita in Application Model? – kenshinji

+0

@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. –

0

Ho rielaborato una parte di e (fx) clipse per ottenere ciò. Dai un'occhiata a this. Scusa per la spina senza vergogna ...