我一直在尝试在新项目中遵循领域驱动的设计方法。我通常一直使用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);
}
}
这引发了两个问题:
我曾考虑过要创建一个创建此类的工厂,但是仅包含导致问题的“new”关键字就需要大量代码开销。
这里有我遗漏的方法吗,还是我做错了所有事情?
最佳答案
我认为在这种情况下,注入RenditionFactory是正确的方法。我知道这需要额外的工作,但是您还可以从 class 中删除违反SRP的行为。在业务逻辑内部构造对象通常很诱人,但我的经验是,注入对象或对象工厂的回报是100次中的99次。特别是在提到的对象很复杂和/或与系统资源交互的情况下。