Maison >interface Web >js tutoriel >Combinaison de modèles de référentiel et basés sur les événements
Une réponse asynchrone aux modifications de données peut être obtenue dans des systèmes qui font abstraction de la persistance des données en combinant le modèle de référentiel avec une architecture pilotée par les événements. Cette combinaison est particulièrement utile pour les systèmes qui nécessitent que certaines actions, notamment la mise à jour de systèmes externes, la journalisation des modifications ou l'envoi de notifications, soient lancées à la suite d'opérations de base de données.
Combinons maintenant les deux modèles dans un exemple.
Mise en œuvre étape par étape :
1️⃣ Définir un référentiel pour les entités utilisateur
2️⃣ Émettre des événements lorsque les données changent
3️⃣ Réagissez aux événements de manière asynchrone
1. Référentiel d'utilisateurs avec émission d'événements
Nous étendrons l'exemple UserRepository précédent pour émettre des événements lorsque certaines actions, comme la création d'un utilisateur, ont lieu.
class EventDrivenUserRepository extends InMemoryUserRepository { private eventEmitter: EventEmitter; constructor(eventEmitter: EventEmitter) { super(); this.eventEmitter = eventEmitter; } async save(user: User): Promise<void> { await super.save(user); this.eventEmitter.emit('userCreated', user); // Emit event on user creation } }
Ici, nous étendons InMemoryUserRepository pour émettre un événement userCreated chaque fois qu'un nouvel utilisateur est enregistré.
2. Abonné à l'événement pour gérer la logique métier
Nous pouvons désormais définir des abonnés aux événements qui écouteront des événements spécifiques et réagiront de manière asynchrone.
const eventEmitter = new EventEmitter(); const userRepository = new EventDrivenUserRepository(eventEmitter); // React to the 'userCreated' event eventEmitter.on('userCreated', (user: User) => { console.log(`New user created: ${user.name}`); // Perform additional tasks, like sending an email });
3. Combiner référentiel et événementiel dans la pratique
Mettons tout ensemble et simulons la sauvegarde d'un utilisateur et la réaction à l'événement :
(async () => { const user = { id: '2', name: 'Jane Smith', email: 'jane@example.com' }; await userRepository.save(user); })();
Dans ce scénario, l'enregistrement d'un nouvel utilisateur via userRepository déclenchera l'événement userCreated et l'abonné exécutera la logique associée (par exemple, la journalisation ou l'envoi de notifications) de manière asynchrone.
Avantages de la combinaison de modèles de référentiel et de modèles basés sur les événements
?? Architecture découplée : Le référentiel est uniquement responsable de l'accès aux données, tandis que la logique métier (comme l'envoi de notifications ou le traitement des mises à jour externes) est gérée par les écouteurs d'événements. Cette séparation des préoccupations conduit à un code plus maintenable.
?? Évolutivité : La gestion asynchrone des événements permet au système de mieux évoluer. Vous pouvez facilement ajouter plus d'écouteurs d'événements pour réagir à différents événements sans modifier la logique du référentiel principal.
?? Flexibilité : Le système devient plus flexible, car vous pouvez ajouter ou supprimer des écouteurs d'événements sans modifier la logique métier de base.
Par exemple, vous pouvez ajouter de nouvelles actions déclenchées par la création d'un utilisateur, comme notifier des services externes, sans altérer le référentiel des utilisateurs.
Conclusion
Le modèle de référentiel et l'architecture événementielle fonctionnent ensemble pour créer des systèmes incroyablement évolutifs et découplés. Les événements permettent une communication asynchrone et des réponses du système aux changements d'état, tandis que le référentiel offre une abstraction pour l'accès aux données. Lorsqu'ils sont combinés, ces modèles vous aident à créer un code plus facile à maintenir, plus lisible et capable de gérer une logique réactive et des mises à jour en temps réel.
Cette combinaison est particulièrement utile pour les systèmes distribués sophistiqués où la séparation des responsabilités et le traitement asynchrone sont cruciaux, que vous développiez des microservices ou un système monolithique.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!