我一直在尝试在新项目中遵循领域驱动的设计方法。我通常一直使用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需要“Transcoder”),并且我想使用诸如Spring之类的东西注入它们,那么我必须使用AOP来运行我的程序,这是我不喜欢的。
  • 如果我要对MediaAsset进行单元测试,以测试是否将新格式移到了临时存储中,那么该怎么做?我无法模拟rendition类以验证其方法是否被称为...真正的Rendition类将被创建。

  • 我曾考虑过要创建一个创建此类的工厂,但是仅包含导致问题的“new”关键字就需要大量代码开销。

    这里有我遗漏的方法吗,还是我做错了所有事情?

    最佳答案

    我认为在这种情况下,注入RenditionFactory是正确的方法。我知道这需要额外的工作,但是您还可以从 class 中删除违反SRP的行为。在业务逻辑内部构造对象通常很诱人,但我的经验是,注入对象或对象工厂的回报是100次中的99次。特别是在提到的对象很复杂和/或与系统资源交互的情况下。

    07-27 19:58