2009-09-17 17 views
10

私の現在のプロジェクトはSpringを利用しており、設計者はSpringがServicesオブジェクト、Repositoriesオブジェクト、Factoryオブジェクトを管理することを決定しましたが、ドメインオブジェクトは管理しませんでした。私たちは、ドメイン駆動設計に密接に従っています。ドメインオブジェクトにバネを使用していないのは、主に静的な依存性の注入のみを許可するということです。私が静的な依存性注入を意味するのは、依存関係がXML構成内で指定され、それらが "フリーズ"するということです。Springでのランタイム依存性注入

私の現在の理解は、私のドメインはオブジェクトとの通信にインターフェイスを利用していますが、春のxml構成では具体的な依存関係を指定する必要があるということです。したがって、デプロイ時にすべての具体的な依存関係を解決する必要があります。時々、これは実行可能ではありません。ほとんどのユースケースは、ランタイムデータに基づく特定のタイプの注入、またはエンドユーザから受信したメッセージに基づいています。

私たちのデザインのほとんどは、次のコマンドパターンです。したがって、コマンドを受け取ったときには、ドメインモデルを作成し、コマンドから受け取ったデータに基づいて、特定のタイプのセットを集約ルートオブジェクトに注入します。したがって、ランタイムデータに基づいてドメインモデルを構築する春の能力が不足しているため、静的なファクトリメソッド、ビルダー、およびファクトリパターンを使用する必要があります。

春に上記のシナリオに問題がある場合は、アドバイスをいただけますか?

私はAOPを使用して依存関係を注入できますが、私は春のインフラストラクチャを活用していません。

答えて

2

Springの依存性注入(一般的な依存性注入)は、基本的にサービス、リポジトリ、ファクトリなどを結ぶためのものです。コマンドなどに応じて動的に行う必要があるものを直接処理することは想定されていません。ドメインオブジェクトを持つほとんどのもの。代わりに、あなたがそれらを行うのに使用したいオブジェクトを配線することによって、それらのことが行われる方法を制御することができます。

+2

これは少し短いスプリングを販売しています。これらのことは可能ですが、もう少し努力するだけです。 – skaffman

10

Using AspectJ to dependency inject domain objects with Springに関するSpringのドキュメントのセクションを読むことをお勧めします。

それはあなたがAOPは Springのインフラの中核部分であることを考慮すると、「私は依存関係を注入するためにAOPを使用することができますが、その後、私は春のインフラを活用しておりません」と述べていることは興味深いです。 2人は一緒にとてもうまく行く。

上記のリンクを使用すると、Springのインフラストラクチャを直接参照することなく(例えば、new演算子を使用して)作成しているドメインオブジェクトに、SpringのAOPに透過的に依存関係を注入させることができます。非常に賢いですが、深いレベルのクラスローディングが必要です。

+0

+1。しかし、この特定のシナリオの複雑さにもよりますが、AOPの代わりにFactoryBeansを使用することは実現可能(かつ容易)かもしれません。 – ChssPly76

+0

私は同意する、私は通常、気にしないだろう。ただし、アプリケーションがハードコアDDDの場合、ファクトリは望ましくない可能性があります。 – skaffman

5

Springの依存性注入/設定は、データソース、トランザクション管理、リモート処理、サーブレットのマウントポイントなど、低レベルの技術インフラストラクチャを設定するためのものです。

テクニカルAPIとサービスの間でspringを使用し、通常のJavaコードを作成するだけでそれらのサービス内をルーティングします。 Springをドメインモデルやサービス実装から守ることは良いことです。まず、アプリケーションのビジネスロジックを1つのフレームワークに結びつけたり、アプリケーションドメインモデルに低レベルの技術的問題を「リーク」させたくありません。 IDEで春のXML設定よりもJavaコードを変更する方がずっと簡単です。ビジネスロジックをJavaで維持すると、新しい機能をより迅速に提供し、アプリケーションをより簡単に保つことができます。 JavaはSpringのXMLフォーマットよりもはるかに表現力豊かなので、プレーンなJavaに固執すれば、ドメインの概念をより明確にモデル化できます。

+0

ちょうど春は多くのことをすることができるということは、あなたのアプリがそれらのすべてのもののためにSpringを使用するようにすることであるとは限りません。 – M1EK

+0

これは標準的な貧血ドメインモデルに当てはまりますが、IMOではドメイン駆動設計(これらはOPが彼が使用していると言っている)でこれらのことを行うことは問題ありません。 –

+0

この回答は、クリーンなオブジェクト指向設計を持ち、ドメインモデルオブジェクトのメソッドとしてドメインロジックを実装する非貧血ドメインモデルに非常に(おそらくもっと)適用されます。 そして、貧血ドメインモデルは非常に標準ではありません。彼らは避けるべきものです*。 – Nat