2010-03-16 11 views
3

Comment puis-je résoudre ce:variables globales dans Eclipse RCP

J'ai informtion UserCredential dans mon principal plug-in RCP. Tous les autres plugins devraient avoir cette information aussi bien. Le stockage de préférence n'est pas possible, car le magasin de présélection a également besoin d'un nom de noeud qui doit être disponible globalement.

Existe-t-il des possibilités de réaliser des variables globales?

Merci!

+0

similaires à: http://stackoverflow.com/q/1245833/565879 – Buttons840

Répondre

8

Il existe plusieurs options.


L'approche rapide et sale consiste à placer un getter pour votre variable globale dans l'activateur d'un de vos plug-ins. Alors que vous venez de faire votre monde comme:

SomePluginActivator.getDefault().getGlobalData()

Cela a l'inconvénient de faire vos plug-ins couplés étroitement, ce qui va un peu contre l'esprit d'un plug-in architecture.


La deuxième approche consiste à utiliser un service de plan de travail. C'est un peu mieux, même si cela introduit une dépendance sur org.eclipse.ui dans vos plug-ins. Dans le plug-in qui fournit les données globales, créez une extension de org.eclipse.ui.services. Vous définissez une interface de service et une fabrique de services. L'usine doit renvoyer une implémentation de l'interface. Vos clients récupèrent une instance du service global en demandant à un localisateur de service une instance de l'interface de service. La plate-forme utilise votre usine pour créer l'instance du service:

IMyGlobalService service = (IMyGlobalService) PlatformUI.getWorkbench().getService(IMyGlobalService.class);

C'est le modèle de localisation de service familier. L'avantage de cette approche est que les consommateurs de certaines données mondiales n'ont pas besoin de savoir d'où elle vient. Pour plus de flexibilité, vous pouvez déclarer l'interface dans un plug-in et l'usine et l'implémentation dans un autre, de sorte que vous puissiez échanger des implémentations.


La troisième approche consiste à utiliser un point d'extension. Je n'ai pas essayé cela moi-même, mais il semble que vous devriez pouvoir déclarer un point d'extension dans un plug-in qui fournit des données globales, puis injecter les données globales dans les plug-ins qui l'étendent.


La dernière approche consiste à utiliser un service OSGi. Je connais moins cette approche. Vous écririez un service OSGi, et d'autres plug-ins utiliseraient le framework OSGi pour localiser le service. Ceci est similaire aux services du plan de travail ci-dessus, mais n'utilise pas directement Eclipse RCP. Vous devriez également lire sur le whiteboard pattern (avertissement: lien PDF).

+0

données ne changeront pas entre les invocations de service? N'est-il pas possible plateforme peut disposer d'un service pour libérer de la mémoire ou quelque chose? – Dims

1

Je réalise que cette question a été posée il y a longtemps, mais je n'ai pas trouvé de discussion plus récente sur ce problème.

Je suis nouveau dans le développement RCP, mais pourquoi ne pas utiliser IEclipsePreferences? Ecrire:

IEclipsePreferences rootNode = Platform.getPreferencesService().getRootNode(); 
rootNode.put("currentFileName", "my.file.name.txt"); 

Lire ailleurs:

IEclipsePreferences rootNode = Platform.getPreferencesService().getRootNode(); 
String currentFileName = rootNode.get("currentFileName", null);