我一直在尝试在我的新项目中遵循领域驱动的设计方法。我一直通常使用 Spring 进行依赖注入,它很好地将我的应用程序代码与构造代码分开,但是,使用 DDD,我似乎总是有一个域对象想要创建另一个域对象,它们都有状态和行为。
例如,给定一个媒体文件,我们希望将其编码为不同的格式——媒体资产调用转码服务并接收回调:
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);
}
}
这引发了两个问题:
- 如果再现需要一些依赖项(例如 MediaAsset 需要“转码器”)并且我想使用 Spring 之类的东西来注入它们,那么我必须使用 AOP 才能让我的程序运行,这是我不喜欢的。
- 如果我想要一个 MediaAsset 的单元测试来测试新格式是否移动到临时存储,那么我该怎么做?我无法模拟再现类来验证它是否调用了它的方法......将创建真正的再现类。
有一个工厂来创建这个类是我考虑过的,但是仅仅包含导致问题的“new”关键字就需要很多代码开销。
这里有没有我错过的方法,或者我只是做错了?