Μετάβαση στο περιεχόμενο

Σειρά εκτέλεσης

┌─ globalBehaviors.before ─┐ ┌── call site ──┐ ┌─ globalBehaviors.after ─┐
│ LoggingBehavior │ → │ CacheBehavior │ → │ TraceBehavior │ → η συνάρτηση
└──────────────────────────┘ └───────────────┘ └─────────────────────────┘
← το αποτέλεσμα επιστρέφει πίσω μέσω της αλυσίδας ←

Κάθε behavior λαμβάνει το context και το next, δηλαδή το υπόλοιπο της αλυσίδας. Εκτελεί κώδικα πριν καλέσει το next(), μετά από αυτό, ή απαντά άμεσα χωρίς να το καλέσει (όπως συμβαίνει σε ένα cache hit).

Θέση Δηλώνεται στο Εκτελείται
Global before createPipeline({ globalBehaviors: { before } }) πρώτο, εξωτερικά
Call site pipeline.wrap(options, ...entries) με τη σειρά των δηλωμένων entries
Global after createPipeline({ globalBehaviors: { after } }) τελευταίο, πιο κοντά στη συνάρτηση

Το globalBehaviors είναι ένα αντικείμενο ή ένας πίνακας αντικειμένων, καθένα με ένα scope: 'commands', 'queries', 'events' ή 'all' (η προεπιλογή). Τα entries κάθε αντικειμένου που ταιριάζει εφαρμόζονται με τη σειρά που παρατίθενται:

createPipeline({
globalBehaviors: [
{ scope: 'all', before: [LoggingBehavior] },
{ scope: 'commands', before: [AuditBehavior] },
{ scope: 'queries', after: [CacheBehavior] },
],
});

Μια κλάση behavior εκτελείται το πολύ μία φορά ανά λειτουργία.

  • Όταν δηλώνεται καθολικά και στο call site, εκτελείται στην καθολική (global) της θέση, με τις ρυθμίσεις του call site να υπερισχύουν (shallow merge) των καθολικών ρυθμίσεων.
  • Όταν δηλώνεται σε δύο καθολικά entries, το πρώτο καθορίζει τη θέση της· ένα μεταγενέστερο tuple μπορεί να προσθέσει επιπλέον ρυθμίσεις.

Αυτό διασφαλίζει ότι ένας φρουρός (guard) παραμένει εκεί όπου τοποθετήθηκε αρχικά. Ένα behavior εξουσιοδότησης τοποθετημένο στο globalBehaviors.before παραμένει έξω από το cache ή το idempotency, ακόμη και αν ένα call site το επαναδηλώνει για να περάσει κανόνες, αποτρέποντας την παράκαμψη του ελέγχου από αποθηκευμένα αποτελέσματα.

Ένα behavior μπορεί να δηλώσει ότι πρέπει να εκτελείται πριν ή μετά από κάποιο άλλο όταν συνυπάρχουν· για παράδειγμα, το idempotency πρέπει να εκτελείται μετά την εξουσιοδότηση. Μια αλυσίδα που παραβιάζει έναν τέτοιο κανόνα αποτυγχάνει κατά τον έλεγχο διαμόρφωσης που περιγράφεται στο Πώς τυλίγεται μια λειτουργία. Οι κανόνες επαληθεύουν τη σειρά διάταξης· δεν αλλάζουν αυτόματα τη σειρά της αλυσίδας.

Μια τυλιγμένη συνάρτηση που καλεί μια άλλη τυλιγμένη συνάρτηση ξεκινά ένα εμφωλευμένο pipeline. Το εμφωλευμένο pipeline λαμβάνει το tenant και το correlation id από το εξωτερικό, εκτός αν ένα source ορίζει διαφορετικά: δείτε Το context του pipeline.