36

Alistair Cockburn の元の記事を含む、Ports & Adapters アーキテクチャに関するさまざまな情報源を読んだ後でも、「ポート」と「アダプタ」という用語の明確な意味についてまだ確信が持てません。特に、これらの概念を実装アーティファクトにマッピングする場合はなおさらです。

いくつかの情報源 (この投稿など) は、このアーキテクチャ パターンのポートが非常に外側のアーティファクトであり、その後にポートと心臓部にあるアプリケーションの間で変換する中間層のアダプターが続くことを示唆しています。

ただし、Cockburn の元の記事では、通信の方向に応じて、ポートがアダプター層の外側と内側に表示されます。

  • インバウンド通信: 「イベントが外部からポートに到着すると、テクノロジ固有のアダプタがそれを使用可能なプロシージャ コールまたはメッセージに変換し、アプリケーションに渡します。
  • アウトバウンド通信: 「アプリケーションが送信するものを持っている場合、ポートを介してアダプターに送信し、受信テクノロジー (人間または自動) が必要とする適切な信号を作成します。

実際、私にとっては、「すべて外側」のアプローチも「内側と外側」のアプローチも意味がありません。ポートは、通信の方向に関係なく、常にアプリケーションの隣に配置されるアーティファクトと見なされます。これは、ポートアダプターの比喩とも一致します。シリアルポートを備えたデバイスを使用して、シリアルポートを備えていない別のデバイスをこれに接続するには、デバイスの観点からインバウンドおよびアウトバウンド通信を適応させるアダプターが必要です。

このアーキテクチャの実装に関して言えば、ポートの定義はアプリケーションの一部としてではなく、さまざまなアダプタがアプリケーションの「外部」にあると考えます。例)単一ポートの実装は、facade(インバウンド通信用のアダプターによって呼び出される) とinterface(アウトバウンド通信用のアダプターによって実装される) で構成されます。

ポートアダプターという用語の正しい意味は何ですか? また、これらの概念を実装成果物にどのようにマッピングできますか?

アップデート:

私の理解に似たこの記事を見つけました。問題は、何らかの共通の合意があるかどうかです。

4

4 に答える 4

23

inf3rno は元の質問を明確にする良い答えを出しましたが、ポートとアダプターの他の用途を強調することは役立つかもしれません。

私の理解によると、ポートはあなたのインターフェースの表現です

ポート:

  • コアの機能の公開を定義します (「着信」ポート用)。
  • 外部世界に対するコアのビューを定義します (「発信」ポート用)

アダプター:

  • コンポーネント(六角形)の外側にあります
  • ポートとターゲット間のトランスポートが、ポートのインターフェースとの契約を満たす方法で行われるようにするために使用されます
  • 六角形をテストするために(依存性注入を使用して)置き換えるものです

ポートはアダプターを受け入れ、アダプターがインターフェースを実装していることを確認する必要があります。次に、アダプターで適切なメソッド/関数を呼び出すだけです。

ポートは通信テストに含める必要があります。その場合、「モックアウト」されるのは、隣接する 2 つの六角形 (または六角形とサービス) のコアであり、ポート/アダプター/アダプター/ポート アセンブリをテストします。

詳細については、James Gardner と私が2014 年 7 月にロンドンで開催された Skillsmatter Microservices ミートアップで行った Hexagonal Microservices に関する講演をご覧ください。

于 2014-09-11T21:17:38.937 に答える
4

私の見解では、元の記事を読み、Alistair Cockurn (「Alistair in the Hexagone」) による講演をいくつか見た後、正しいアプローチは、いわゆる「すべて内部」、つまりインバウンドとアウトバウンドの両方のコミュニケーションであると思います。ポートはアダプタの「内側」にあります。アダプターは、アプリと対話する外部アクターとポートの間にあります。ポートはアプリに属します。

インバウンド通信では、アクター (ドライバー アクター) がドライバー アダプターを使用して通信をトリガーします。このアダプターは、アプリのドライバー ポートを呼び出し、アプリに何かを要求します。

アウトバウンド通信の場合、アプリはドリブン ポートを定義して呼び出すことにより、ドリブン アクターとの通信をトリガーします。このポートは、目的に関してアプリが必要とするもののコントラクト (通常はインターフェイス) です。このポートは、外部アクターと通信するアダプターによって実装されます。

依存関係は次のとおりです。

Driver Actor --> Driver Adapter --> Hexagon <-- Driven Adapter <-- Driven Actor

ポートは Hexagon に属します:

ドライバー ポートは、Hexagon to Driver Adapters によって提供される API です。

駆動ポートは、Hexagon が必要とする SPI であり、駆動アダプターによって実装されます。

元の記事にある、あなたが言及したこの文にも苦労しました。

「イベントが外部からポートに到着すると、テクノロジ固有のアダプターがそれを使用可能なプロシージャ コールまたはメッセージに変換し、アプリケーションに渡します。」

ドライバーポートは「外部」ドライバーアダプターであると言っています。しかし、記事全体を読んでトークを見ていると、そうではないと思います。この文で「ポート」と呼ばれるものは、単に外部ドライバー アクターとアダプター間の相互作用です。「ポート」は、アダプターとアプリの間の相互作用である必要があります (「... アプリケーションに渡します」)。

于 2018-04-14T10:34:28.817 に答える