DDDでは、ドメインサービスは基本的にはファサードパターンやメディエーターパターンだけですか?


12

ドメイン駆動設計では、ドメイン層にいくつかの(従来の)サービスを含めることができます。たとえば、ユーザードメインの場合、次のようになります。

  • さまざまな方法でUserオブジェクトを構築するUserFactory
  • インフラストラクチャレイヤーの永続サービスとの対話を担当するUserRepository

ドメインレイヤーのUserServiceは、これら2つのサービスとインフラストラクチャレイヤーのメディエーターやファサードにすぎませんか、それともそれ以上ですか?



Level Gorodinskiの投稿をたくさん読んだことがありますが、その2番目のリンクを見たことはありません。よく読んで、間違いなくいくつかの重要な点に触れます!
e_i_pi 2017

回答:


9

Domain services それらがそうでないものによって最もよく説明されています

  • 彼らはどちらEntitiesでもないAggregate roots
  • ではない Value objects
  • 自然に1つ Entityまたは1つだけに当てはまらないドメイン知識を運ぶ Value object

aの例Domain serviceは次のSaga/Process managerとおりです。複数のものを含む長期実行プロセスを調整Aggregate rootsしますBounded contexts

そうは言っても、でありDomain serviceどのように実装されるは、2つの直交するものです。

ドメインレイヤーのUserServiceは、これら2つのサービスとインフラストラクチャレイヤーのメディエーターやファサードにすぎませんか、それともそれ以上ですか?

いくつかの様ドメインサービスUserRepository(で定義されたインターフェースにより構成されるDomain layerとにおける具体的な実装はInfrastructure layerことができる使用して実装することがFacadeデザインパターンを。他のドメインサービスはそうではありません。

他のレイヤー(およびSOLID)に依存してはならないという重要なルールを除いて、それらを実装する方法についてハードルールはDomain layerありません。


ありがとう、ドメインレイヤーがようやく理解できたと思います。データオブジェクト(集約、エンティティ、値オブジェクト)を保持するだけでなく、ビジネスルールも保持しますが、これらのルールの具体的な実装は保持しません。ドメインサービスは、ドメインデータオブジェクトに対して実行できることを定義しますが、それらの操作が内部でどのように機能するかについては知りません。
e_i_pi 2017

1
@e_i_piビジネスルールは、集計とそのネストされたエンティティによってのみ保護されます。ドメインサービスはこれに関与しません。
コンスタンティンガルベヌ

1
@e_i_pi。操作には複数の集約が含まれます。たとえば、Person(別のAggregate)のBankAccounts(Aggregates)のリストを指定すると、ドメインサービスはそれらのアカウントの合計残高を計算します。
コンスタンティンガルベヌ

1
@e_i_pi:いくつかの誤解があると思います。つまり、ドメインレイヤー全体がドメインのソフトウェアモデルです。あなたは「データオブジェクト(集約、エンティティ、値オブジェクト)を保持することに加えて」と述べました-これらは単にデータを保持するという意味では「データオブジェクト」ではありません。これらは実際にドメインルールを実装し、動作を定義します。E. EvansによるDDD Bookによると、ドメインサービスは、オブジェクト(エンティティまたは値オブジェクト)に自然に適合しないドメインの側面です。
FilipMilovanović2017

1
むしろ、ドメインサービスは、「クライアントに対して何ができるかという観点から純粋に定義され」、ドメインモデルの他の要素によって定義されます(そのため、これらの要素を何らかの方法で調整し、そのオーケストレーションを管理するドメインルールを適用します)。ドメインサービス自体はステートレスです。また、上位レベルのレイヤーに常駐し、ドメインレイヤーへのインターフェースとして機能することにより、ユーザーストーリーまたは同等のユースケースを実装するアプリケーションサービスの概念もあります。オブジェクトとサービスの比率は、モデル化されるドメインによって異なることに注意してください。
FilipMilovanović2017

1

依存関係の逆転の結果としてDDDにサービスが表示されます。

「プレーン」な依存関係を使用する場合、ドメインコードはデータベースを呼び出してエンティティ、またはエンティティを作成するファクトリを保存またはクエリし、データベースまたは外部サービスやその他のインフラストラクチャコードに関連付けられます。

しかし、それはドメインコードがどうあるべきかではありません。ドメインコードはインフラストラクチャコードに依存しないようにする必要があります。この依存関係により、テストや、場合によっては再利用が難しくなります。これが、その依存関係を逆にする理由です。インフラストラクチャコードをドメインコードに依存させる。そのためには、抽象化を導入する必要があります。ドメインコードがインフラストラクチャによって実装されることを期待する動作を定義する抽象化。

DDDのサービスはその抽象化です。ほとんどの場合、ドメインコードの場合、これらのサービスはプレーンなインターフェースである必要があります。そして、それらのインターフェースに依存するインフラストラクチャー・コードに実装を含める必要があります。


あなたの答えをありがとう、両方の答えを一緒にして「あはは!」瞬間。私はあなたの答えがなければその概念を完全に理解できなかったと思いますが、私はコンスタンティヌスの答えを将来の読者への指標として好みます。
e_i_pi 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.