La naissance d’un Elfe peut mener à deux choix distincts. Soit votre Elfe vivra seul pour toujours, soit il se multipliera pour prospérer et dominer le m…. Soyons sérieux, ici il est question de singletons et des autres.
Un Elfe (service) de ce type est très simple à créer car il suffit de dériver sa
classe du type Elf.Alone
. Vous pouvez alors y adjoindre les quêtes que vous
souhaitez de la même manière que pour un service instanciable plusieurs fois.
Dans le cas d’un singleton, vous ne devez pas avoir de quête create
ni de
quête delete
. Par contre il est d’usage d’y adjoindre une quête init
faisant
office de constructeur.
const {Elf} = require('xcraft-core-goblin');
class Valinor extends Elf.Alone {
async init() {
/* await quelque chose ... */
}
}
module.exports = Valinor;
Il n’est pas obligatoire d’y adjoindre une quête
init
. Dans ce cas il est d’usage d’utiliser une quête nomméeboot
. Il est important de respecter les noms utilisés par ce type de quêtes. En effet,create
etinit
on un fonctionnement particulier selon le type destate
utilisé par votre Elfe, voir la section Son état.
Les service d’instances sont un petit peu différents car il doivent dériver du
type Elf
. Les quêtes fonctionnent de la même manière que pour les Elfes seuls.
Néanmoins deux quêtes remplacent la quête init
présenté avec les singletons.
La quête create
doit être utilisé comme constructeur pour le service, et la
quête delete
comme “destructeur”.
const {Elf} = require('xcraft-core-goblin');
class Elrond extends Elf {
async create(id, desktopId = null) {
/* await quelque chose ... */
}
delete() {
/* quelque chose ... */
}
}
module.exports = Elrond;
Il est fortement recommandé de toujours utiliser des quêtes de delete
100%
synchrones. Des effets de bords indésirables peuvent survenir si vous effectuez
du code asynchrone dans une quête de type delete
. En effet, l’ordonnanceur
Goblin ne s’attend pas à devoir gérer de l’asynchrone dans un delete
quand un
Goblin de même ID doit être instancié au même moment.
Ici on parle de Goblin, car ce comportement est généralisé. Dans certains cas il est possible d’utiliser un
delete
asynchrone si vous pouvez garantir que le code appelé ne provoque aucun race avec uncreate
pour ce même ID.
N’oubliez pas de les y emmener en plaçant le fichier de service Xcraft à la
racine d’un des arbre de Valinor. Uhm, pardon, j’veux dire à la racine de votre
module Goblin bien entendu. Il n’y a aucune différence entre l’exportation
Xcraft pour un Elfe de type Elf.Alone
et un Elfe de type Elf
.
const {Elf} = require('xcraft-core-goblin');
const {Elrond} = require('./lib/elrond.js');
exports.xcraftCommands = Elf.birth(Elrond);
Ceci est un exemple avec un Elfe sans état (sans state).