ドメイン駆動設計では、ドメイン層にいくつかの(従来の)サービスを含めることができます。たとえば、ユーザードメインの場合、次のようになります。
ドメインレイヤーのUserServiceは、これら2つのサービスとインフラストラクチャレイヤーのメディエーターやファサードにすぎませんか、それともそれ以上ですか。
Domain services
は、そうでないものによって最もよく説明されます。
Entities
でもAggregate roots
でもないValue objects
ではありませんEntity
またはoneValue object
Domain service
の例はSaga/Process manager
です。これは、異なるAggregate roots
からの複数のBounded contexts
を含む長時間実行プロセスを調整します。
そうは言っても、whatはDomain service
であり、how実装されていることは2つの直交するものです。
ドメインレイヤーのUserServiceは、これら2つのサービスとインフラストラクチャレイヤーのメディエーターやファサードにすぎませんか、それともそれ以上ですか?
SomeUserRepository
(Domain layer
で定義されたインターフェースとInfrastructure layer
での具体的な実装で構成される)のようなドメインサービスcanFacade
デザインパターン。他のドメインサービスはそうではありません。
Domain layer
が他のレイヤーに依存してはならないという重要なルール(および S.O.L.I.D。 )を除いて、それらを実装するためのhowに関する難しいルールはありません。
Dependency Inversion の結果、DDDにサービスが表示されます。
「プレーン」な依存関係を使用する場合、ドメインコードはデータベースを呼び出してエンティティ、またはエンティティを作成するファクトリを保存またはクエリし、データベースまたは外部サービスやその他のインフラストラクチャコードに関連付けられます。
しかし、それはドメインコードがどうあるべきかではありません。ドメインコードはインフラストラクチャコードに依存しないようにする必要があります。この依存関係により、テストや、場合によっては再利用が難しくなります。これが、その依存関係を逆にする理由です。インフラストラクチャコードをドメインコードに依存させる。そのためには、抽象化を導入する必要があります。ドメインコードがインフラストラクチャによって実装されることを期待する動作を定義する抽象化。
DDDのサービスはその抽象化です。ほとんどの場合、ドメインコードの場合、これらのサービスはプレーンなインターフェースである必要があります。そして、実装は、これらのインターフェースに依存するインフラストラクチャコード内にある必要があります。