問題タブ [hexagonal-architecture]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
architecture - サードパーティの SOAP プロバイダーとクリーン アーキテクチャ
クリーン/六角形アーキテクチャ パラダイムを使用してアプリケーションを設計していますが、これについては初心者です。いくつか質問があります。
シナリオは次のとおりです。
- 「エンティティ」情報と関連する「ドキュメント」を提供する外部 SOAP サービスがあります。
- すべてのエンティティについて、アプリケーションは次のことを行う必要があります。
- すべてのエンティティ ドキュメントを CMS に保存する (コンテンツといくつかのエンティティ属性)
- 格納されたドキュメント参照を使用して DDBB にエンティティを格納する
Java のようなアプローチでの最初のソリューションを見てみましょう。
エンティティとドキュメント
ドメイン層での FRepositori の抽象化
ドメイン層での DocumentRepositori の抽象化
SOAP サービスのアプリケーション層での ExternalService 抽象化
アプリケーション層でのユースケースの実装
質問
- ExternalService については、Entity と Document で抽象化を定義するのが正しいですか、それとも UseCase 実装がエンティティに変換する ValueObject を返す必要がありますか?
- Document については、集約ルートとして設計し、Entity から Document オブジェクトの参照を排除する必要がありますか?
domain-driven-design - Hexagonal アーキテクチャの UI にデータを表示する
私は DDD と Hexagonal アーキテクチャを学んでいます。基本は理解できたと思います。ただし、解決方法がわからないことが 1 つあります。ユーザーにデータを表示するにはどうすればよいでしょうか。
たとえば、いくつかの機能を備えた Worker エンティティ (一部のメソッドによってエンティティが変更されます) と WorkerRepository を持つ単純なドメインを取得したので、Worker を永続化できます。ドメインを操作するためのいくつかのコマンドとコマンド バス (ワーカーの作成、作業時間の更新、変更の永続化など) を含むアプリケーション層と、WorkerRepository と GUI アプリケーションの実装を含むインフラストラクチャ層を取得しました。
このアプリケーションでは、すべてのワーカーにデータの一部を表示し、それらを変更できるようにしたいと考えています。データを表示するにはどうすればよいですか?
- WorkerRepository の実装への参照を与えることができます。この方法では、コマンド バスをスキップして新しいワーカーをリポジトリに挿入できるため、これは良い解決策ではないと思います。コマンドバスを介してすべての変更が行われるようにします。
- では、WorkerRepository を WorkerQueryRepository と WorkerCommandRepository に分割し (CQRS に従って)、WorkerQueryRepository のみを参照します。リポジトリは、それらを変更するメソッドを持つ Worker エンティティを返すため、これはまだ良い解決策ではありません。これらの変更はどのように永続化されますか?
- 2 種類のリポジトリを作成する必要がありますか? 1 つはドメインとアプリケーション層で使用され、もう 1 つはデータを外部に提供するためだけに使用されます。2 つ目は、完全な Worker エンティティを返すのではなく、GUI が必要とするデータのみを含む WorkerDTO のみを返します。このように、GUI でワーカーを変更する方法は他になく、コマンド バスを使用するだけです。
3番目のアプローチは正しい方法ですか?または、変更がコマンドバスを通過する必要があることを強制するのは間違っていますか?
domain-driven-design - 他のドメインとの相互作用に関する混乱
まったく新しいdomain model
(およびBounded Context
) ' Appointment
' 用の新しいアプリケーションを作成しています。CQS
新しいドメインには、Hexagonal Architecture
(ポートとアダプターを使用して) を組み合わせることにしました。
パッケージ構造は主に次のようになります。
私の質問:
- このパッケージ構造は、私たちが達成しようとしていることに問題ありませんか?
インターフェイスを介して他のドメインとの間のすべての通信を確認したいと考えてい
AppointmentScheduleFacade
ます。クロスドメイン通信は、分散されていないため、単純なメソッド呼び出し (RPC または REST なし) として存在します。ファサードは主に次のものに委任します。
AppointmentScheduleApplicationService.java
モデル修正用AppointmentScheduleQueryService.java
他のドメインにデータを渡すため。
この設定は大丈夫ですか?または、他のドメインがApplication
andに直接対応する必要がありQueryService
ますか?
hexagonal-architecture - リポジトリを備えた六角形のアーキテクチャ
の例を通して六角形のアーキテクチャを理解しようとしていRepository
ます。このセットアップでは、次のレイヤーがあります: フレームワーク (インフラストラクチャ) -> アプリケーション -> ドメイン。
私はドメイン部分に持っています.aを介して重複がないかどうかUser
を検証したいとしましょう. この情報を取得するには、どこかからこの情報が必要です。ドメインレイヤーにインターフェースを再度追加しました。このようにして、上のレイヤーで解決できます。User
DuplicateUsernameValidator
UserRepository
これは私にとってトリッキーになる部分です。のロジックを実装したいのですがUserRepository
、これをアプリケーション層に実装するのは意味がありません。なぜなら、永続化コンテキストはインフラストラクチャ層 (JdbcUserRepository
または などJpaUserRepository
) にあるからです。しかし、六角形の構造を正しく理解していればUserRepository
、インフラストラクチャ レイヤーにインターフェイスを直接実装することはできません。これは、インフラストラクチャ レイヤーがドメイン レイヤーを認識する必要がないためです。
私は何が欠けていますか?