2011-06-29 17 views
30

Ogni bundle nel mio progetto OSGi ha il proprio BundleActivator, che a mio avviso è normale. Questo viene passato all'attuale BundleContext, che è utile avere in giro per ottenere riferimenti di servizio e quant'altro.La migliore tecnica per ottenere il contesto del bundle OSGi?

Tuttavia, dalle classi nel mio fagotto, come posso ottenere il BundleContext? Assegnarlo a un campo statico pubblico nel BundleActivator fa schifo e passarlo come argomento fa schifo. C'è un modo più intelligente?

+1

In secondo luogo: l'attivatore predefinito generato dalla PDE è molto discutibile. Considero questo un bug: https://bugs.eclipse.org/bugs/show_bug.cgi?id=392919 – oberlies

risposta

44

È possibile utilizzare FrameworkUtil.getBundle(ClassFromBundle).getBundleContext().

Vedere FrameworkUtil JavaDoc.

+2

Grazie, questa tecnica è esattamente ciò che cercavo. – xconspirisist

+1

Come è meglio di una variabile statica nel tuo Activator? Invece della tua classe, ora dipende da un metodo di framework statico. Ciò rende il tuo codice ancora più difficile da testare. –

+1

Non è necessariamente migliore, ma 1. non è necessario scrivere l'attivatore 2. è possibile ottenere il contesto di un altro pacchetto. In ogni caso RaduK ha ragione riguardo alla centralizzazione del codice specifico di OSGi. –

-4

Non c'è magia qui. Hai bisogno di un modo per fornire le informazioni alle altre classi. Quindi è disponibile tramite lo stack di chiamate o in qualche posto ben noto (ad esempio, statico).

13

Una buona pratica nello sviluppo di fasci OSGi a mio parere è quello di provare a scrivere il codice relativo OSGi centralizzare quanto possibile. In questo modo, se si desidera utilizzare il codice in un ambiente non OSGi, lo sforzo di migrazione è minimo.

Pertanto, utilizzando i riferimenti statici o FrameworkUtil tutto il luogo non è una buona idea imho. Né si sta utilizzando un normale OSGi. Prova a guardare iPOJO o Servizi dichiarativi.

+0

Un commento perspicace, grazie. Riconosco che le classi strettamente integrate con OSGi sono cattive pratiche, ma FrameworkUtil dall'altra risposta ha risposto alla domanda. Grazie anche per i riferimenti ai servizi dichiarativi, leggerò anche su quello. – xconspirisist

9

Un'altra alternativa è quella di utilizzare dichiarativa Services, che consente di ricevere il BundleContext nel vostro metodo di attivatore. Per esempio, supponendo che si utilizza il BND Annotazioni per DS:

@Activate 
public void activate(BundleContext context) { 
    // ... 
} 

Tuttavia, come ha detto RaduK, è molto meglio se si può scrivere la maggior parte del codice in stile POJO senza usare OSGi API come BundleContext.

Problemi correlati