私はドメイン駆動設計を研究していて、コア、ドメイン、API、インフラストラクチャという用語を使用するオニオンアーキテクチャの概念を紹介されました。
私はJavaバックグラウンドで、典型的なプロジェクト構造(レガシーMVCパターン)の構成、モデル(値とエンティティーの両方)、リポジトリ、サービス、コントローラー、およびビュー)に精通しています。
Onion Architectureに従ってプロジェクトをビルドする場合、構造の関連コンポーネントをコア、ドメイン、API、インフラストラクチャにどのように適合させるべきですか? APIの部分は理解できますが、コアとインフラストラクチャと混同しています。
たとえば、ドメインに関連するすべてのビジネスロジックが、エンティティ値オブジェクトリポジトリなどのドメイン内に入るとします。
次に、コアとは何で、インフラストラクチャには何がありますか?以下の説明が理解できません
Coreは、ドメインやテクノロジーに固有ではないビルディングブロックであり、リスト、ケースクラス、アクターなどの一般的なビルディングブロックを含みます。技術的な概念は含まれません。 RESTまたはデータベース。
インフラストラクチャは、データベース、ユーザーインターフェイス、外部サービスなどのさまざまなテクノロジのアダプタを含む最外層です。すべての内部レイヤーにアクセスできますが、ほとんどの操作はAPIを経由する必要があります。ただし、インフラストラクチャ実装のドメインインターフェイスは例外です。
これらの2つのレイヤーの概念を明確に理解するのを手伝ってくれませんか?
少し後戻りして、元の Jeffrey Palermoによって提案されたオニオンアーキテクチャ を見てみましょう。
外部スキンは、ユーザーインターフェース、テストスイート(アイデアは、内部のすべてに対してTDDと同様の体系的なテストを促進することです)、およびインフラストラクチャという外部の世界へのインターフェースです。
次に、コアに向かって深く掘り下げ、アプリケーションサービス、ドメインサービス、およびドメインオブジェクト(コアのコア内)を見つけます。
ここでは、インフラストラクチャの意味が他の場所とは異なります。これは実際には外部の世界へのインターフェースであり、特にデータベース管理システムや外部のWebサービス、ローカルまたはクラウドストレージサービスなど、外部から供給されるサービスへのインターフェースです。
「アダプター」という用語は、Cockburnの hexagonal architecture から直接インスピレーションを得ています。つまり、アダプターの内側は変更されないままですが、外側のパーツは異なる場合があるということです。したがって、ある日、アプリケーションサービスをOracle DBMSに接続するOracleアダプタを使用して、翌日、MongoDBアダプタを開発し、新しい永続化レイヤとしてMongoに切り替えることができます。
したがって、プラットフォームとOS固有のものはインフラストラクチャ層にある必要があります。このロジックに従うと、内側の円にあるものはすべてプラットフォームに依存しません(「テクノロジーに依存しない」は誤解を招く可能性があります)。
ここに、元のオニオンアーキテクチャに マッピングの例 があります。
ただし、 Wade Waldron のバリアントは、内部では少し異なります。
このビデオ は、オニオンアーキテクチャのヴァルドロンの変形例を詳細に説明します。
同じ質問があり、まだ少し混乱している人にとって、これは彼らを助けるかもしれません。
1.インフラストラクチャ:定義によると、インフラストラクチャの一部は、ドメインクラス(ビジネス関連ロジックで構成されます)とデータベースの関係の間のブリッジです。 [〜#〜] orm [〜#〜](Hibernate Springデータと同様)を使用している場合、実装はすでにそこにあります。全体の概念はデカップリングについてです。
2.コア:受け入れられた回答のおかげでコア部分はすでに美しく説明されています。私はコアの中に値オブジェクトを入れたいと思います
コアは、ドメインやテクノロジーに固有ではないビルディングブロックであり、リスト、ケースクラス、アクターなどの一般的なビルディングブロックを含みます。
値オブジェクトを指し、カスタムタイプの場合があります。