web-dev-qa-db-ja.com

ドメインサービスはどのように参照する必要がありますか?

DDDを使用するつもりで、テストプロジェクトに取り組んでいます。

これまでのところ、私はこの基本的なプロジェクト構造を持っています:

enter image description here

私の質問は:Core.Domain.Servicesはどのように参照する必要がありますか?アプリケーションサービスに対して行ったようなインターフェイスプロジェクトを作成し、依存性注入を使用する方法を教えてください。

編集:より正確に言うと、エンティティまたはアプリケーションサービスなどでドメインサービスを使用したいとします。どのように参照しますか?ドメインサービスごとにインターフェイスを作成し、DIを使用するにはどうすればよいですか?インターフェイスと実装はどこに属していますか(どのレイヤー/プロジェクト)?

もしそうなら、そのようなプロジェクトはどこに属していますか?

(ドメインサービスを作成するタイミングとアンチパターンに該当しないようにするために何を避けるべきかについての私の意見を明確にすることができるように、この素​​晴らしい投稿を参照します: ドメインサービスvsアプリケーションサービス

3
Dree Droo

「ドメイン駆動設計の実装」のVaughn Vernonは、次のようにアドバイスしています。

ドメインサービスの目的によっては、モデリングが非常に簡単な場合があります。サービスに Separated Interface [Fowler、P of EAA]を含めるかどうかを決定する必要があります。

次に、次の選択肢もあります。

  • インターフェースは、最も扱いやすいAggregateと同じパッケージ/モジュールで宣言できます。 Vernonは、認証サービスは「アイデンティティーの概念」であるため、authenticationインターフェースをユーザー、グループなどと同じアイデンティティー固有の集計で宣言できるという例を使用しています。

実装は次の場所で行うことができます。

  • 「依存関係逆転の原則または六角形を使用している場合、このやや技術的な実装クラスをドメインモデルの外部の場所に配置することを決定する場合があります。」 (同上)
  • 「技術的な実装は、インフラストラクチャ層のモジュールに収容される可能性がある」(同上)

「ドメイン駆動設計のパターン、原則、および実践」で、Scott MillettとNick Tuneはさまざまなタイプのドメインサービスについて述べています。 1つは「契約の表現」に関するものであり、ドメインモデルはインターフェースのみに関心があるため(ドメインモデルのどこで定義する必要があるかは明らかです)、実装は(上記と同じように)技術的で、ドメイン。

これらは単なるアドバイスであることに注意してください。それはすべて、何が何に依存するかに依存します。通常、ドメインモデルは他の要素に最小限依存する必要があります。理想的には、何にも依存しないのが理想的です。実際には、いくつかのインフラストラクチャ機能に依存する場合があります。つまり、ドメインはそれ自体では外部のものを処理できません。たとえば、すべてがアプリケーション層を通過します。これは、依存関係が注入される可能性が高い場所です。また、オブジェクトドメインは、使用されるインターフェースを定義します。

つまり、インターフェースはドメインモデルで定義されます。実施場所は、サービスの目的により異なります。

サービスの使用は、ドメインモデル自体でも、ドメインに依存する隣接レベル(アプリケーションレベル、アーキテクチャによって異なる)からも発生する可能性があります。

PS。パッケージコアの呼び出しは実際にはDDDに反対するのではないかという印象があります。それはソリューションスペース名です。うまくいけば、ここで公開するためにプロジェクトを編集しただけです。それ以外の場合は、コアやアプリケーションなどではなく、概念の適切な名前を使用して、集計やサービスを作成するか、少なくともソリューション関連の名前の使用を最小限の規則に最小限に抑えます。

3
Roman Susi

意味のある(つまり、ビジネス関連の)パッケージまたはプロジェクトがないため、どこに置くかを決めるのに問題があると思われます。

これを実用的に見てみましょう。あなたのデザインは3レベルの深さで見えますが、あなたのプロジェクトが何であるか私にはわかりません。

また、変更を加えたとします。クライアントは、新しいタイプの製品(またはドメインが実際に何であれ)を追加するように指示するか、表示される属性を製品に追加するよう指示します。これらの変更はどこに実装されますか?これらのプロジェクトのそれぞれ(またはほとんど)を変更する必要があると思います。

完全に汎用的で技術的なものではなく、ドメインの自然な構造を使用すると、適切な場所を見つけるのに問題が少なくなり、最終的には保守性が向上します。

2