Services
Pratiquement tout (événements, permissions, etc.) est géré à travers des services. Tous les services sont accessibles à travers le gestionnaire de services:
import org.spongepowered.api.Sponge;
Sponge.getServiceManager().provide(EventManager.class);
Si vous avez besoin d’accéder à la référence d’un objet, vous avez juste à l’obtenir du gestionnaire de service.
Lignes Directrices des Services
Les services doivent être enregistrés durant l’état
POST_INITIALIZATION
, au plus tard.Les services doivent être entièrement opérationnels à l’état
SERVER_ABOUT_TO_START
.
Vous pouvez en savoir plus à propos des états sur la page Cycle de vie des Plugins.
Note
C’est une bonne pratique d’enregistrer les services le plus tôt possible pour que les autres plugins puissent noter que le service sera fourni.
Fournir votre propre service
Votre plugin peut fournir une implémentation d’une interface essentielle comme PermissionService ou d’une interface personnalisée qui ne fait pas partie de SpongeAPI (telle que l’économie ou un serveur web) :
Sponge.getServiceManager().setProvider(Object plugin, Class<T> service, T provider);
L’objet provider
doit implémenter l’interface ou la classe service
.
Designer l’API de la sorte rend Sponge extrêmement modulaire.
Note
Les plugins devraient fournir des options pour ne pas installer leurs fournisseurs si le plugin n’est pas dédié qu’à une seule fonction.
Exemple : Fournir un service de warps simple
La première étape est optionnelle, mais recommandée. Vous spécifiez les méthodes publiques de votre classe de service dans une interface:
import org.spongepowered.api.world.Location;
import org.spongepowered.api.world.World;
import java.util.Optional;
public interface WarpService {
void setWarp(String name, Location<World> location);
Optional<Location<World>> getWarp(String name);
}
Maintenant vous pouvez écrire la classe qui implémente votre interface:
import java.util.HashMap;
public class SimpleWarpService implements WarpService {
HashMap<String, Location<World>> warpMap = new HashMap<String, Location<World>>();
@Override
public Optional<Location<World>> getWarp(String name) {
if(!warpMap.containsKey(name)) {
return Optional.empty();
} else {
return Optional.of(warpMap.get(name));
}
}
@Override
public void setWarp(String name, Location<World> location) {
warpMap.put(name, location);
}
}
Maintenant nous pouvons enregistrer une nouvelle instance de lac lasse auprès du gestionnaire de services. Nous utilisons l’interface WarpService.class
en tant que clé du service
.
Cela rend possible à d’autres développeurs de plugins d’écrire leur propre implémentation de votre service (en implémentant l’interface) et remplace votre version.
PluginContainer plugin = ...;
Sponge.getServiceManager().setProvider(plugin, WarpService.class, new SimpleWarpService());
Les autres plugins peuvent maintenant accéder à votre service à travers le gestionnaire de service:
Sponge.getServiceManager().provide(WarpService.class);
Astuce
Si vous ne voulez pas utiliser d’interfaces, remplacez simplement la clé service
par votre classe (SimpleWarpService.class
dans l’exemple).