Heim  >  Artikel  >  Web-Frontend  >  Kombination von Repository- und ereignisgesteuerten Mustern

Kombination von Repository- und ereignisgesteuerten Mustern

Susan Sarandon
Susan SarandonOriginal
2024-10-09 20:34:021040Durchsuche

Combining Repository and Event-Driven Patterns

Eine asynchrone Reaktion auf Datenänderungen kann in Systemen erreicht werden, die die Datenpersistenz abstrahieren, indem sie das Repository-Muster mit einer ereignisgesteuerten Architektur kombinieren. Diese Kombination ist besonders hilfreich für Systeme, die bestimmte Aktionen erfordern, einschließlich der Aktualisierung externer Systeme, der Protokollierung von Änderungen oder dem Senden von Benachrichtigungen, die nach Datenbankvorgängen initiiert werden müssen.

Jetzt kombinieren wir die beiden Muster zu einem Beispiel.

Schritt-für-Schritt-Umsetzung:

1️⃣ Definieren Sie ein Repository für Benutzerentitäten
2️⃣ Ereignisse ausgeben, wenn sich Daten ändern
3️⃣ Asynchron auf Ereignisse reagieren

1. Benutzer-Repository mit Ereignisemission

Wir erweitern das vorherige UserRepository-Beispiel, um Ereignisse auszugeben, wenn bestimmte Aktionen, wie z. B. die Benutzererstellung, stattfinden.

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
  }
}

Hier erweitern wir das InMemoryUserRepository, um ein userCreated-Ereignis auszugeben, wenn ein neuer Benutzer gespeichert wird.

2. Ereignisabonnent zur Handhabung der Geschäftslogik

Wir können jetzt Ereignisabonnenten definieren, die auf bestimmte Ereignisse warten und asynchron reagieren.

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. Kombination von Repository und ereignisgesteuert in der Praxis

Lassen Sie uns alles zusammenfügen und das Speichern eines Benutzers und die Reaktion auf das Ereignis simulieren:

(async () => {
  const user = { id: '2', name: 'Jane Smith', email: 'jane@example.com' };
  await userRepository.save(user);
})();

In diesem Szenario löst das Speichern eines neuen Benutzers über das userRepository das userCreated-Ereignis aus und der Abonnent führt die zugehörige Logik (z. B. Protokollierung oder Senden von Benachrichtigungen) asynchron aus.


Vorteile der Kombination von Repository- und ereignisgesteuerten Mustern

?? Entkoppelte Architektur: Das Repository ist nur für den Datenzugriff verantwortlich, während die Geschäftslogik (wie das Senden von Benachrichtigungen oder die Verarbeitung externer Updates) von den Ereignis-Listenern verwaltet wird. Diese Trennung der Belange führt zu besser wartbarem Code.

?? Skalierbarkeit: Durch die asynchrone Ereignisbehandlung kann das System besser skaliert werden. Sie können ganz einfach weitere Ereignis-Listener hinzufügen, um auf verschiedene Ereignisse zu reagieren, ohne die Kernlogik des Repositorys zu ändern.

?? Flexibilität: Das System wird flexibler, da Sie Ereignis-Listener hinzufügen oder entfernen können, ohne die Kerngeschäftslogik zu ändern.

Sie können beispielsweise neue Aktionen hinzufügen, die durch die Benutzererstellung ausgelöst werden, wie z. B. die Benachrichtigung externer Dienste, ohne das Benutzer-Repository zu ändern.


Fazit

Repository Pattern und Event-Driven Architecture arbeiten zusammen, um unglaublich skalierbare und entkoppelte Systeme zu schaffen. Ereignisse ermöglichen asynchrone Kommunikation und Systemreaktionen auf Zustandsänderungen, während das Repository eine Abstraktion für den Datenzugriff bietet. In Kombination helfen Ihnen diese Muster dabei, Code zu erstellen, der einfacher zu warten, besser lesbar und in der Lage ist, reaktive Logik und Echtzeitaktualisierungen zu verarbeiten.

Diese Kombination ist besonders hilfreich für anspruchsvolle, verteilte Systeme, bei denen die Trennung von Verantwortlichkeiten und asynchrone Verarbeitung von entscheidender Bedeutung sind, unabhängig davon, ob Sie Microservices oder ein monolithisches System entwickeln.

Das obige ist der detaillierte Inhalt vonKombination von Repository- und ereignisgesteuerten Mustern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn