Plugins/fr

Vue d'ensemble
OpenSimulator utilise de nombreux mécaniqmes pour activer la configuration dynamique des fonctionnalités. Cette page décrit ces mécanismes.

Plugins Dynamiques avec Mono.Addins
Certains types de plugins sont découverts lors de l'exécution en utilisant des Extension Points, et chargés en utilisant Mono.Addins. Ce mécanisme est décrit en détails ici et ici.

Ces types de plugins sont utilisés quand il est nécessaire de charger tous les plugins d'un type particulier.

Ce mécanisme est actuellement utilisé dans les cas suivants:

/OpenSim/Startup - application plugins (IApplicationPlugin). Chargés par OpenSimBase quand OpenSimulator démarre. Les plugins sont chargés en utilisant PluginLoader.

/OpenSim/RegionModules - region modules. Chargés par RegionModulesControllerPlugin, qui est lui même un plugin application. Les plugins sont chargés en appellant AddinManager directly (sans passer par PluginLoader).

/OpenSim/WindModule - wind models. Chargés par WindModule, qui est lui même un module de région. Les plugins sont chargés en appellant AddinManager directement.

Points d'extensions non utilisés
Il y a quelques points d'extensions définis qui ne sont jamais chargés pour le moment. Par exemple, OpenSim.data.MySQL.addin.xml définit les plugins qui fournissent des implémentations pour des points d'extensions comme "/OpenSim/GridData" et "/OpenSim/AssetData". Cependant, personne ne charge actuellement ces points d'extension (à ce que je vois). Au lieu de cela, ces plugins sont chargés en utilisant la technique des config-files expliquée précédemment.

Ces points ont été retirés du code OpenSimulator code apres 0.7.1.1.

Spécifier l'implémentation des Plugins dans la Configuration
Pour la plupart des plugins, la classe qui devrait etre utilisée pour implémenter l'interface des plugins est spécifiée explicitement dans un des fichiers .INI. Ensuite l'application charge simplement l'assemblage (DLL); trouve la classe spécifiée; et l'instancie.

Ces types de plugins sont utilisés quand il est évident de devoir charger une implémentation unique du plugin; non pas toutes les implémentations disponibles. Par exemple, un seul module d'acces à la base de données est utilisé. Donc les fichiers .INI contiennent les directives comme cela :

[DatabaseService] StorageProvider = "OpenSim.Data.MySQL.dll"

Parfois la définition spécifie aussi quelles classes utiliser. Par exemple:

[InventoryService] LocalServiceModule = "OpenSim.Services.InventoryService.dll:XInventoryService"

Voyons de plus près l'exemple du plugin data-access. La plupart des classes qui ont besoin d'accéder à la base de données possèdent une interface Data déjà définie. Par exemple, PresenceService définit IPresenceData. Cette interface possède l'implémentation de tous les supports de base de données de OpenSimulator. Quand le service démarre, il charge l'assemblage de base de données qui est spécifié dans la configuration, puis trouvent dans cet assemblage la classe qui implémente l'interface désirée (IPresenceData). Le code ressemble à celà (bien qu'il soit simplifié):

IConfig dbConfig = config.Configs["DatabaseService"]; string dllName = dbConfig.GetString("StorageProvider"); IPresenceData m_Database = LoadPlugin(dllName);

Connecteurs
Robust trouve et charge ses Connectors en les ayant spécifiés explicitement dans Robust.ini (dans la section "ServiceConnectors"). Etant donné que les plugins sont spécifiés, ceci fonctionne en chargeant les DLL manuellement. Cependant c'est quelque part similaire à à la technique Mono.Addins en cela que Robust charge tous les connectors spécifiés; non pas un seul. Peut être que cela pourrait être refait en utilisant de vrais Mono.Addins.

Les connecteurs sont chargés en appellant ServerUtils.LoadPlugin.