Ajout de nouvelles interfaces

De nouveaux types d'objets peuvent être transmis au constructeur d'un composant en les enregistrant avec l'extension org.eclipse.core.component.types. Arrivés à ce point, il faut préciser le terme composant. Les composants sont des objets de toutes sortes créés depuis un point d'extension en injectant des arguments dans son constructeur. Les composants New-style en sont un exemple, mais il en existe d'autres.

L'exemple suivant montre une extension de types d'exemple. Cet exemple spécifie que l'interface INameable devrait être disponible depuis le site d'un composant.

<extension
      point="org.eclipse.core.component.types">
   <composant
         initializer="org.eclipse.ui.part.SiteInitializer"
         interface="org.eclipse.ui.part.services.INameable"
         implementation="org.eclipse.ui.internal.part.services.NullNameableService"
         singleton="true"
   />
</extension>

L'attribut initializer indique où l'interface sera utilisée. Par exemple, la chaîne "org.eclipse.ui.part.SiteInitializer" signifie que l'interface est utilisée sur un site de composant. Nous aurions également pu utiliser "org.eclipse.ui.part.PartInitializer" si l'interface avait été destinée à l'implémentation des composants eux-mêmes.

L'attribut interface est le nom de l'interface. Il doit correspondre exactement au type que le composant recevra dans son constructeur. Si nous créons une extension fournissant des chaînes et qu'un composant demande un objet, il n'utilisera pas notre extension même si le type en est compatible.

L'attribut implementation identifie l'implémentation par défaut de l'interface. Il pointe vers une classe de composants qui implémente l'interface ou une 'Fabrique de composants' (ComponentFactory) qui peut les créer. Pour plus d'informations, voir la section qui traite des 'Fabriques de composants' (ComponentFactory). Cette implémentation est utilisée pour satisfaire une dépendance quand un composant demande cette interface et qu'elle est introuvable dans son contexte parent. Toutes les interfaces doivent fournir une implémentation par défaut. Cela veut dire qu'un composant écrit correctement fonctionnera toujours dans une étendue donnée, quel que soit le nombre de dépendances fournies par son contexte parent. L'implémentation ne peut étendre ou se substituer à l'attribut interface en implémentant des interfaces supplémentaires. D'autres composants peuvent dépendre de ce composant au travers de ses interfaces enregistrées, mais ils ne peuvent pas dépendre directement de la classe d'implémentation.

L'attribut singleton indique si l'implémentation par défaut est un singleton. S'il est 'true', une seule instance sera créée et partagée entre tous les autres composants en ayant besoin. S'il est 'false', une nouvelle instance sera créée pour chaque conteneur qui en a besoin. Par exemple, dans le cas de composants, singleton=:"false" signifierait qu'une instance sera créé pour chaque composant.