web-dev-qa-db-ja.com

クラスは2つの実装を表すことができますか?

私はいくつかのことについて確信が持てません:

  • NotificationDispatcherインターフェースを実装するクラスがあります。私がWhatsappNotificationDispatcherと名付けたこのクラス、別の実装はEmailNotificationDispatcherによって行われます。

  • Whatsappメッセージ配信自体は、外部サービスプロバイダーのAPIによって実装されます。

だから今私は両方のクラスを持っています

[1]ディスパッチタイプ(Whatsapp)を実装します[2]そのタイプのサービスプロバイダーを実装します

さらに悪いことに、これはすべて私のアプリケーション層で起こっています。 WhatsappNotificationDispatcherはAPIの実装ですが、サービスでもあるためです。

実装をインフラストラクチャ層に移動する必要があります常に?また、WhatsappNotificationDispatcherの追加のインターフェースを作成する必要がありますか?特定のサービスプロバイダーAPIを実装しますか?それは狂気のようです。

1
Michael

私がよく理解している場合、あなたのWhatsappNotificationDispatcherは外部のサービスプロバイダーへのリクエストを直接実装します。

この図でこれを示してみました。ResAPIは、一般的なAPUリクエストを外部プロバイダーにルーティングするのに役立つプロキシです。

enter image description here

まず第一に、これは私には完全に問題ないように思えます。クラスはインターフェースを実装しており、これにはAPIを使用して外部にリクエストを送信する必要があります。

今では、セッション管理などを使用して、クラスでhttpを介した低レベルのリクエスト作成を実装しているとは想像できません。これを処理するためにプロキシを追加したのはこのためです。この汎用プロキシはインフラストラクチャ層にあります。

より良いアプローチは、 ゲートウェイパターン を使用して、特定のAPI自体をカプセル化することです。ディスパッチャレベルはアプリケーションサービスを提供し、アプリケーション層に残ります。ただし、ゲートウェイは下位レベル(データアクセスと同じレベル)になります。この設計には、クラスをSRPに準拠させるという追加の利点があります。

ただし、通知ディスパッチャーにWhatsappサービスプロバイダーAPIのみを使用する場合、この追加の個別のゲートウェイは不要なオーバーヘッドになる可能性があります。したがって、全体像に応じて決定する必要があります。この場合、直感的にはアプリケーション層にクラスを許可しますが、その逆も防御できます(結局、ゲートウェイが必要ないことを確認してください)。

1
Christophe