データ変更に対する非同期応答は、リポジトリ パターンとイベント駆動型アーキテクチャを組み合わせることで、データの永続性を抽象化するシステムで実現できます。この組み合わせは、外部システムの更新、変更のログ記録、通知の送信など、データベース操作の後に開始される特定のアクションを必要とするシステムに特に役立ちます。
次に、2 つのパターンを組み合わせて例を作ってみましょう。
段階的な実装:
1️⃣ ユーザー エンティティのリポジトリを定義する
2️⃣ データ変更時にイベントを発行する
3️⃣ イベントに非同期的に反応する
1.イベント発行のあるユーザー リポジトリ
前の UserRepository の例を拡張して、ユーザーの作成などの特定のアクションが発生したときにイベントを発行します。
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 } }
ここでは、新しいユーザーが保存されるたびに userCreated イベントを発行するように InMemoryUserRepository を拡張します。
2.ビジネス ロジックを処理するイベント サブスクライバー
特定のイベントをリッスンして非同期に反応するイベント サブスクライバーを定義できるようになりました。
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.リポジトリとイベント駆動型の実際の組み合わせ
すべてをまとめて、ユーザーの保存とイベントへの反応をシミュレートしてみましょう:
(async () => { const user = { id: '2', name: 'Jane Smith', email: 'jane@example.com' }; await userRepository.save(user); })();
このシナリオでは、userRepository を通じて新しいユーザーを保存すると userCreated イベントがトリガーされ、サブスクライバーは関連するロジック (ログ記録や通知の送信など) を非同期的に実行します。
リポジトリとイベント駆動型パターンを組み合わせる利点
?? 分離されたアーキテクチャ: リポジトリはデータ アクセスのみを担当し、ビジネス ロジック (通知の送信や外部更新の処理など) はイベント リスナーによって処理されます。この関心事の分離により、コードがより保守しやすくなります。
?? スケーラビリティ: 非同期イベント処理により、システムの拡張性が向上します。コア リポジトリ ロジックを変更せずに、さまざまなイベントに反応するイベント リスナーを簡単に追加できます。
?? 柔軟性: コアのビジネス ロジックを変更せずにイベント リスナーを追加または削除できるため、システムの柔軟性が向上します。
たとえば、ユーザー リポジトリを変更せずに、外部サービスへの通知など、ユーザーの作成によってトリガーされる新しいアクションを追加できます。
結論
リポジトリ パターンとイベント駆動型アーキテクチャが連携して、信じられないほどスケーラブルで分離されたシステムを作成します。イベントにより、非同期通信と状態変化に対するシステム応答が可能になり、リポジトリはデータ アクセスの抽象化を提供します。これらのパターンを組み合わせると、保守が容易で読みやすく、リアクティブなロジックとリアルタイム更新を処理できるコードを構築するのに役立ちます。
この組み合わせは、マイクロサービスを開発しているかモノリシック システムを開発しているかに関係なく、責任の分離と非同期処理が重要である高度な分散システムに特に役立ちます。
以上がリポジトリとイベント駆動型パターンの組み合わせの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。