web-dev-qa-db-ja.com

オニオンアーキテクチャでドメインドリブンデザインを構築する方法

私はドメイン駆動設計を研究していて、コア、ドメイン、API、インフラストラクチャという用語を使用するオニオンアーキテクチャの概念を紹介されました。

私はJavaバックグラウンドで、典型的なプロジェクト構造(レガシーMVCパターン)の構成、モデル(値とエンティティーの両方)、リポジトリ、サービス、コントローラー、およびビュー)に精通しています。

Onion Architectureに従ってプロジェクトをビルドする場合、構造の関連コンポーネントをコア、ドメイン、API、インフラストラクチャにどのように適合させるべきですか? APIの部分は理解できますが、コアとインフラストラクチャと混同しています。

たとえば、ドメインに関連するすべてのビジネスロジックが、エンティティ値オブジェクトリポジトリなどのドメイン内に入るとします。

次に、コアとは何で、インフラストラクチャには何がありますか?以下の説明が理解できません

Coreは、ドメインやテクノロジーに固有ではないビルディングブロックであり、リスト、ケースクラス、アクターなどの一般的なビルディングブロックを含みます。技術的な概念は含まれません。 RESTまたはデータベース。

インフラストラクチャは、データベース、ユーザーインターフェイス、外部サービスなどのさまざまなテクノロジのアダプタを含む最外層です。すべての内部レイヤーにアクセスできますが、ほとんどの操作はAPIを経由する必要があります。ただし、インフラストラクチャ実装のドメインインターフェイスは例外です。

これらの2つのレイヤーの概念を明確に理解するのを手伝ってくれませんか?

3
Mu Pi

概観

少し後戻りして、元の Jeffrey Palermoによって提案されたオニオンアーキテクチャ を見てみましょう。

外部スキンは、ユーザーインターフェース、テストスイート(アイデアは、内部のすべてに対してTDDと同様の体系的なテストを促進することです)、およびインフラストラクチャという外部の世界へのインターフェースです。

次に、コアに向かって深く掘り下げ、アプリケーションサービス、ドメインサービス、およびドメインオブジェクト(コアのコア内)を見つけます。

インフラ

ここでは、インフラストラクチャの意味が他の場所とは異なります。これは実際には外部の世界へのインターフェースであり、特にデータベース管理システムや外部のWebサービス、ローカルまたはクラウドストレージサービスなど、外部から供給されるサービスへのインターフェースです。

「アダプター」という用語は、Cockburnの hexagonal architecture から直接インスピレーションを得ています。つまり、アダプターの内側は変更されないままですが、外側のパーツは異なる場合があるということです。したがって、ある日、アプリケーションサービスをOracle DBMSに接続するOracleアダプタを使用して、翌日、MongoDBアダプタを開発し、新しい永続化レイヤとしてMongoに切り替えることができます。

したがって、プラットフォームとOS固有のものはインフラストラクチャ層にある必要があります。このロジックに従うと、内側の円にあるものはすべてプラットフォームに依存しません(「テクノロジーに依存しない」は誤解を招く可能性があります)。

コアに向かって

ここに、元のオニオンアーキテクチャに マッピングの例 があります。

  • ドメインオブジェクト(エンティティ、値オブジェクト、集計)はコアにあります
  • ドメインの周りには、ドメインサービス(リポジトリ、サービスなど)があります。
  • そして、あなたの周りにはまだアプリケーションサービスがあります。つまり、ユーザーインターフェイスや他のインターフェイスが接続されているサービスです。

ただし、 Wade Waldron のバリアントは、内部では少し異なります。

  • コアは、ドメインに依存せず、ドメインによって使用されるアプリケーションブロックを構築して作られています。それは標準ライブラリによって提供されるものに似ています。個人的には、これは良い考えではないと感じています。これらの基本的な構成はこの構造に適合しません。それらは実際に次のリングで使用されますが、ドメインを経由しなくても、他のリングでも使用できます。実際、コアはこのアーキテクチャに直交する必要があります。つまり、コアへの連続したリングを経由する必要なく、アーキテクチャの任意の場所でリストを使用できます。
  • OK、ドメインは明確ですが、エンティティ、値オブジェクト、集約、リポジトリ、ファクトリ、ドメインサービスなど、ドメインに関連するすべてのものをそこに配置します。そのため、元のモデルのドメインオブジェクトとドメインサービスを再グループ化します。
  • OK、APIは明らかです。これは、元のアーキテクチャのアプリケーションサービスに対応しています。直接アクセスすることはできませんが、外部リングを介してアクセスできます。

このビデオ は、オニオンアーキテクチャのヴァルドロンの変形例を詳細に説明します。

6
Christophe

同じ質問があり、まだ少し混乱している人にとって、これは彼らを助けるかもしれません。

1.インフラストラクチャ:定義によると、インフラストラクチャの一部は、ドメインクラス(ビジネス関連ロジックで構成されます)とデータベースの関係の間のブリッジです。 [〜#〜] orm [〜#〜](Hibernate Springデータと同様)を使用している場合、実装はすでにそこにあります。全体の概念はデカップリングについてです。

2.コア:受け入れられた回答のおかげでコア部分はすでに美しく説明されています。私はコアの中に値オブジェクトを入れたいと思います

コアは、ドメインやテクノロジーに固有ではないビルディングブロックであり、リスト、ケースクラス、アクターなどの一般的なビルディングブロックを含みます。

値オブジェクトを指し、カスタムタイプの場合があります。

0
Mu Pi