Question

Comment puis-je résoudre ceci:

Je informtion UserCredential dans mon principal plug-in RCP. Tous les autres plugins devraient avoir cette information aussi bien. La préférence Store n'est pas possible, car aussi le magasin de presference a besoin d'un nodename qui doit être disponible au niveau mondial.

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

Merci!

Était-ce utile?

La solution

Il y a quelques options.


L'approche rapide et sale est de mettre un getter pour votre variable globale dans l'activateur d'un de vos plug-ins. Ensuite, vous obtenez seulement votre monde comme:

SomePluginActivator.getDefault().getGlobalData()

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


La seconde approche consiste à utiliser un service de table de travail. Ceci est un peu mieux, même si elle introduit une dépendance à l'égard org.eclipse.ui dans vos plug-ins. Dans le plug-in qui fournit les données globales, créer une extension de org.eclipse.ui.services. Vous définissez une usine d'interface de service et le service. L'usine doit retourner une implémentation de l'interface. Vos clients extraient une instance du service global en demandant un localisateur de service pour 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);

Ceci est le modèle de localisation de service familier. L'avantage de cette approche est que les consommateurs de certaines données globales ne ont pas besoin de savoir où il vient. Pour plus de flexibilité, vous pouvez déclarer l'interface dans un plug-in et l'usine et la mise en œuvre dans un autre, de sorte que vous pouvez échanger des implémentations.


La troisième approche consiste à utiliser un point d'extension. Je ne l'ai pas essayé moi-même, mais il semble que vous devriez être en mesure de 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 la prolongent.


La dernière approche consiste à utiliser un service OSGi. Je suis moins familier avec cette approche. Vous écririez un service OSGi, et d'autres plug-ins utiliseriez le cadre OSGi pour localiser le service. Ceci est similaire aux services d'établi ci-dessus, mais il n'utilise pas directement Eclipse RCP. Vous devriez également lire sur le (avertissement: lien PDF).

Autres conseils

Je me rends compte de cette question a été posée il y a longtemps, mais je ne l'ai pas trouvé une discussion plus récente sur cette question.

Je suis nouveau au 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);
scroll top