13
  1. アプリケーションがリポジトリ(インフラストラクチャ サービス)を使用している場合、リポジトリ インターフェイスドメイン レイヤー内で定義されますが、その実装はインフラストラクチャ レイヤー内で定義されます。これは、ドメイン モデルに外向きの依存関係がないためです。

a) 特定の (非リポジトリ)インフラストラクチャ サービス InfServがドメイン層内のコードによって呼び出されないことが 100% 確実である場合、 InfServ のインターフェイスをドメイン層内で定義する必要はないと思いますか?

  1. InfServがドメイン レイヤー内のコードによって呼び出されないと仮定します (そのため、ドメイン レイヤー内でそのインターフェイスを定義する必要はありません)。

a) InfServがアプリケーション層の Servicesによって呼び出される場合、アプリケーション層はインフラストラクチャ層に暗黙的に依存するべきであり、その逆ではないと思いますか? つまり、InfServ のインターフェイスその実装の両方をインフラストラクチャ レイヤー内で定義する必要があります。

b)アプリケーション レイヤーがインフラストラクチャ レイヤーに依存する方が良い理由は、インフラストラクチャ レイヤーは多くのアプリケーションで再利用できるためです。一方、アプリケーション レイヤーはほとんどの場合、単一のアプリケーションにのみ固有であり、通常は他のアプリケーションで再利用できませんか?

c)ドメイン レイヤー内のコードがリポジトリを使用しないことが 100% 確実である場合、ドメイン レイヤー内でそのインターフェイスを定義する必要はありませんか?

アップデート:

1)

はい。ただし、ドメイン層の定義には、ドメインのファサードとして機能するアプリケーション サービスを含めることができます。アプリケーション サービスは通常、リポジトリやその他のインフラストラクチャ サービスを参照します。ドメインオブジェクトと前述のサービスを調整して、ユースケースを実装します。

a)

... ドメインのファサードとして機能する

「通常の」(私の質問で言及していたもの)アプリケーションサービスもドメインのファサードとして機能すると主張できませんか?

b)

アプリケーション サービスは通常、リポジトリやその他のインフラストラクチャ サービスを参照します。

あなたの返信から、「通常の」アプリケーションサービスは通常インフラストラクチャサービスを参照しないことを示唆しているように見えますが(おそらくそうではありません)、実際には(私の知る限り)参照していますか?!

2)

a)

私は通常、前述のようにアプリケーション サービスをドメイン層にマージします。

「通常の」アプリケーション レイヤーも BLL レイヤーの一部であるため、ドメイン レイヤーとマージされているとは言えません(実際にはドメイン レイヤーの上にあります) 。

b)

私は六角形の建築様式に固執する傾向があります...

Hexagonal アーキテクチャには、アプリケーション層(つまり、アプリケーション サービス)の明示的な概念がないように見えますか?

c)

ドメイン層でリポジトリ インターフェイスを宣言する利点の 1 つは、ドメインのデータ アクセス要件を指定できることです。

では、ドメイン コードで使用しない場合でも、ドメイン レイヤーにリポジトリ インターフェイスを含める必要がありますか?

2 番目の更新:

2a)

「通常の」アプリケーション サービスと呼ばれるものがドメインとやり取りする場合、それをドメインの「レイヤー」の一部にすることは許容できると思います。ただし、ドメインは周囲のアプリケーション サービスに直接依存すべきではないため、必要に応じてそれらを個別のモジュールに分割することができます。

  • アプリケーション層(従来の階層化アーキテクチャ)の設計が、たとえばオニオンアーキテクチャを使用してアプリケーション層ドメイン層とマージする場合とは異なることを暗示しているかどうかはわかりません。

  • 少なくともモジュールに関する限り、この 2 つは異なるべきではないと思います。どちらの場合も、アプリケーション層モジュールとドメイン層モジュールを分離できるからです。(告白しなければなりませんが、シャペロン モジュール (Evan の本) を飛ばしました。なぜなら、DDD を学ぶ初期段階でその知識が必要になるとは思わなかったからです :O )

2b)

はい。レイヤード アーキテクチャと対比できるからです。厳密なレイヤード アーキテクチャは、ドメイン レイヤーでリポジトリ インターフェイスを宣言し、インフラストラクチャ レイヤーで実装するという考えとは一致しません。これは、一方では依存関係がありますが、展開に関しては依存関係が他方にあるためです。Hexagonal は、ドメインを中心に配置することでこれらの問題に対処します。タマネギの構造を見てみましょう。基本的には六角形ですが、理解しやすいかもしれません。

私はまだMVCパターンまたはAsp.Net MVCを知りませんが、シリーズの最初の3つの部分を読んだことから(私はそれを読むのをやめたところまで混乱しました)、次のように見えます:

a)オニオンの記事から:

各レイヤーはその下のレイヤーに結合されており、各レイヤーは多くの場合、さまざまなインフラストラクチャの問題に結合されています。

著者は、従来のレイヤード アーキテクチャ TLA ではドメイン レイヤーがインフラストラクチャ レイヤーに結合されていることをほのめかしていますが、これは確かに正しくありません。通常、ドメイン レイヤー内でインフラストラクチャ インターフェイス(リポジトリ インターフェイスなど) を定義しているためです。

b) また、TLA を使用するときにアプリケーション層でインフラストラクチャ インターフェイスを定義することを決定した場合、アプリケーションインフラストラクチャに結合されませんか?!

c)インフラストラクチャ インターフェイスはアプリケーション コアで定義されているため、オニオン アーキテクチャでは * インフラストラクチャ レイヤー* がアプリケーション コア (アプリケーション レイヤーを含む) に結合されていませんか?

d) c)で「はい」の場合、アプリケーション レイヤーインフラストラクチャ レイヤーに結合する方がよいのではないでしょうか(最初の質問で挙げた理由により (ここでは、ドメイン レイヤーはインフラストラクチャ サービスを呼び出さないと想定しています))。

4)

オニオンの記事から:

通常、ドメイン モデルの周りの最初の層は、リポジトリ インターフェイスと呼ばれる、オブジェクトの保存と取得の動作を提供するインターフェイスを見つける場所です。

オニオンの記事から:

コントローラーは、アプリケーション コアで定義されているインターフェイスのみに依存します。すべての依存関係が中心に向かっていることに注意してください。

著者は、依存関係は内部のみであり、インフラストラクチャ インターフェイスはドメイン モデルの周りで定義されているため、ドメイン モデル内のコードはこれらのインターフェイスを参照すべきではないことを暗示しているようです。言い換えれば、 Domain エンティティのメソッドへの引数としてリポジトリ参照を渡すべきではありません(あなた自身が言ったように許可されています):

class Foo
{
           ...
       public int DoSomething(IRepository repo)
       {
              ...
            var info = repo.Get...;
              ...
       }
}

上記の理由により、私はOnion アーキテクチャを使用する利点や、それが TLA とどのように異なるのかさえ理解できていないことを告白しなければなりません (すべてのインフラストラクチャ インターフェイスがドメイン層内で定義されていると仮定します) --> 言い換えれば、TLA を描写できませんでしたか?オニオンのアーキテクチャ図を使用?!

最終更新:

2)

b)

はい。TLA では、ドメイン レイヤーは、インフラストラクチャ レイヤーによって宣言されたクラスに関して、インフラストラクチャと直接通信します。その逆ではありません。

念のために言っておきますが、TLA ではインフラストラクチャ インターフェイスがインフラストラクチャ レイヤーで定義されると言っているのですか(Hexagonal/Onion アーキテクチャではアプリケーション コアで定義されることはわかっています)。

d)

カップリングは双方向です。アプリケーション コアはインフラストラクチャの実装に依存し、インフラストラクチャはアプリケーション コアで宣言されたインターフェイスに依存します。

私のポイントは、Onion アーキテクチャではInfServインターフェースがアプリケーション層内で宣言されているためです (ここでは、InfServがドメイン層によって呼び出されることは決してないという前提があるため、ドメイン内でInfServインターフェースを定義しないことにします– 元の1aの質問を参照してください)。は、アプリケーション層がInfServインターフェイスを制御することを意味します。しかし、元の2bに記載されている理由により、インフラストラクチャ レイヤーがInfServインターフェイスを制御した方がよいと私は主張します。質問?!

4)

著者は、依存関係は内部のみであり、インフラストラクチャ インターフェイスはドメイン モデルの周りで定義されているため、ドメイン モデル内のコードはこれらのインターフェイスを参照すべきではないことを暗示しているようです。

私の意見では、あなたのコード サンプルはコードに適しています。

したがって、オニオンアーキテクチャはドメインモデルがインフラストラクチャインターフェイスを参照することを「許可」していないと言ったのは正しかったです.DMストロングテキスト囲み、DMからそれらを参照することはその依存関係はDMからInDeに上向きになりますか?

DDD は通常、六角形/オニオン アーキテクチャ スタイルで表示されるため、混乱が生じる可能性があります。おそらくあなたがしていることはすでに六角形になっていると思います。それが同じことのように見える理由です。

ええ、私もその印象を受けました。Evan の本を読み終わったら、Hexagonal アーキテクチャをもう少し詳しく調べる予定です (特に、新しい DDD の本はそれに基づいているため)。

4 回目の更新:

2)

d)

インフラストラクチャがインターフェイスと実装を所有している場合、ドメインまたはアプリケーション層は、それ自体の永続性を実装する責任があります。

インフラストラクチャ層で定義されたインターフェースを参照すると、内側層が外側層に依存しないというオニオンのルールになるため、アプリケーションまたはドメイン層はそれを自分で実装する必要があると思います(インフラストラクチャ層は外側層です)?

4)

ドメイン モデルは、一緒に宣言されているため、リポジトリなどのインフラストラクチャ インターフェイスを参照できます。オニオン ダイアグラムのように、アプリケーション層がドメインから分離されている場合、ドメイン層はアプリケーション層で定義できるため、インターフェイスの参照を回避できます。

しかし、その記事によると、インフラストラクチャ インターフェイスはDomain Layerを囲むレイヤーで宣言されています。これは、 Domain Layerよりもアプリケーション コアの外縁に近いことを意味します。記事で指摘されているように、内側のレイヤーには依存関係があってはなりません。外層>!

ありがとうございました

4

2 に答える 2

2

1a) はい。ただし、ドメイン層の定義には、ドメイン上のファサードとして機能するアプリケーション サービスを含めることができます。アプリケーション サービスは通常、リポジトリやその他のインフラストラクチャ サービスを参照します。ドメインオブジェクトと前述のサービスを調整して、ユースケースを実装します。

2a,b)

私は通常、前述のようにアプリケーション サービスをドメイン層にマージします。私は、ポートおよびアダプターとも呼ばれるHexagonal アーキテクチャスタイルに固執する傾向があります。ドメインは中心にあり、アプリケーション サービスによってカプセル化され、リポジトリ、UI、およびサービスを含むすべての外部接続がポートとして機能します。

2c) ドメイン層でリポジトリ インターフェイスを宣言する利点の一部は、ドメインのデータ アクセス要件を指定することです。

更新しました

1a) ここで述べたアプリケーション サービスを「通常の」アプリケーション サービスと区別するつもりはありませんでした。それがドメイン上のファサードである場合、ルールが適用されます。

1b) アプリケーション サービスと呼ぶことはできるが、ドメインに直接関係しないサービスが存在する可能性があるため、それらを除外したいと考えました。

2a) 「通常の」アプリケーション サービスと呼ばれるものがドメインと対話する場合、それをドメインの「レイヤー」の一部にすることは許容できると思います。ただし、ドメインは周囲のアプリケーション サービスに直接依存すべきではないため、必要に応じてそれらを個別のモジュールに分割することができます。

2b) はい。レイヤード アーキテクチャと対比できるからです。厳密なレイヤード アーキテクチャは、ドメイン レイヤーでリポジトリ インターフェイスを宣言し、インフラストラクチャ レイヤーで実装するという考えとは一致しません。これは、一方では一方向に依存関係があるためですが、展開に関しては依存関係がもう一方にあるためです。Hexagonal は、ドメインを中心に配置することでこれらの問題に対処します。タマネギの構造を見てみましょう。基本的には六角形ですが、理解しやすいかもしれません。

2c) はい。ただし、通常、リポジトリ インターフェイスはアプリケーション サービスによって参照されます。

更新 2

2a) それらは異なる方法で実装できますが、一般的な責任は同じです。主な違いは、依存関係グラフにあります。どちらのアーキテクチャでもアプリケーション サービスを独自のモジュールに分離できますが、onion/hexagonal アーキテクチャでは、インターフェイスを使用してインフラストラクチャへの依存関係を宣言することが強調されています。

2ba) はい、これは実際にタマネギ アーキテクチャの特徴です。

b) はい。TLA では、ドメイン レイヤーは、インフラストラクチャ レイヤーによって宣言されたクラスに関して、インフラストラクチャと直接通信します。その逆ではありません。

c) はい、インフラストラクチャはドメイン層によって宣言されたインターフェイスを実装します。

d) カップリングは双方向です。アプリケーション コアはインフラストラクチャの実装に依存し、インフラストラクチャはアプリケーション コアで宣言されたインターフェイスに依存します。

4) 私の意見では、あなたのコード サンプルは適切なコードです。エンティティが何らかのアクションを実行するためにリポジトリにアクセスする必要がある場合があります。ただし、このコードの結合特性を改善するには、エンティティが必要とする機能を宣言する特定のインターフェイスを定義するか、ラムダがさらに適切に利用できる場合のいずれかを使用することをお勧めします。その後、リポジトリはそのインターフェイスを実装でき、アプリケーション サービスは、指定された動作を呼び出すときにリポジトリをエンティティに渡します。このように、エンティティは一般的なリポジトリ インターフェイスに依存せず、非常に特定のロールに依存します。

DDD は通常、六角形/オニオン アーキテクチャ スタイルで表示されるため、混乱が生じる可能性があります。おそらくあなたがしていることはすでに六角形になっていると思います。それが同じことのように見える理由です。

更新 3

2b) TLA では、インターフェイスがないか、同じ種類ではありません。ドメインは永続化フレームワークなどのインフラストラクチャと直接通信するため、永続化を担当します。

2d) インフラストラクチャがインターフェイスと実装を所有している場合、ドメインまたはアプリケーション層は、それ自体の永続性を実装する責任があります。六角形/オニオンでは、持続性の実装はインフラストラクチャの一部です。つまり、抽象ドメインをデータベースに「適応」させます。

4) ドメイン モデルは、一緒に宣言されているため、リポジトリなどのインフラストラクチャ インターフェイスを参照できます。オニオン ダイアグラムのように、アプリケーション レイヤーがドメインから分離されている場合、ドメイン レイヤーはアプリケーション レイヤーで定義できるため、インターフェイスの参照を回避できます。

更新 4

2d) そのステートメントは、UI -> ビジネス ロジック -> データ アクセスのような階層を持つレイヤード アーキテクチャには適用されません。ビジネス ロジック層はデータ アクセス層に依存し、データ アクセス フレームワークのオブジェクト モデルに基づいてデータ アクセスを実装する必要があります。データ アクセス フレームワーク自体は、ビジネス層について何も知りません。

4) この記事では、考えられるアーキテクチャを 1 つだけ指定しています。許容されるバリエーションがあります。

于 2013-01-29T18:53:34.340 に答える
1

ドメインの代わりにアプリケーション層にリポジトリ インターフェイスを配置することの唯一の利点は、別のアプリケーションでドメイン DLL を再利用したい場合です。そこでは、ドメイン エンティティのコレクションをクエリする方法を完全に再定義します。つまり、完全に必要です。異なるリポジトリ。

ただし、そのアプローチには 2 つの大きな障害があります。

  • ドメイン層サービス。これらは、多くのエンティティの岐路にあるプロセスを表しているため、ジョブを実行するには複数の参照が必要です。リポジトリに問い合わせてこれらの参照を取得することは、彼らにとって一般的で便利なことです。

    この例は、RoutingService こちらにあります。

  • また、一部のエンティティが特定の他のエンティティを見つけるためにリポジトリの助けを必要とする特殊なケースもあります。たとえば、それらの間に親子関係がある集約ルートの階層がある場合、特定のインスタンスの 1 つは、「これらの基準を満たすすべての祖先/子孫のリストが必要です」と言うことができます。この種のクエリには、リポジトリが最適のようです。

于 2013-01-30T14:58:46.500 に答える