私は、新しいプロジェクトでドメイン駆動型の設計アプローチに従おうとしています。私は通常、依存性注入にSpringを使用しており、アプリケーションコードを構築コードからうまく分離していますが、DDDを使用すると、状態と動作の両方を持つ別のドメインオブジェクトを作成したい1つのドメインオブジェクトが常にあるようです。
たとえば、メディア ファイルが与えられた場合、それを別の形式にエンコードする必要があります。メディア アセットはトランスコード サービスを呼び出し、コールバックを受け取ります。
class MediaAsset implements TranscodingResultListener {
private NetworkLocation permanentStorage;
private Transcoder transcoder;
public void transcodeTo(Format format){
transcoder.transcode(this,format);
}
public void onSuccessfulTranscode(TranscodeResult result){
Rendition rendition = new Rendition(this, result.getPath(), result.getFormat());
rendition.moveTo(permanentStorage);
}
}
これは2つの問題を投げます:
- レンディションにいくつかの依存関係 (MediaAsset に「トランスコーダー」が必要など) が必要で、Spring などを使用してそれらを注入したい場合、プログラムを実行するために AOP を使用する必要がありますが、これは好ましくありません。
- 新しいフォーマットが一時ストレージに移動されることをテストする MediaAsset の単体テストが必要な場合は、どうすればよいですか? レンディション クラスをモックして、そのメソッドが呼び出されたことを確認することはできません...実際のレンディション クラスが作成されます。
このクラスを作成するためのファクトリを持つことを検討しましたが、「new」キーワードを含めるだけで多くのコード オーバーヘッドが発生し、問題が発生します。
ここに私が見逃しているアプローチがありますか、それともすべて間違っていますか?