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).