gpt4 book ai didi

java - 领域驱动设计 - 可测试性和 "new"关键字

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:51:54 25 4
gpt4 key购买 nike

我一直在尝试在我的新项目中遵循领域驱动设计方法。我一直通常使用 Spring 进行依赖注入(inject),它很好地将我的应用程序代码与构造代码分开,但是,对于 DDD,我似乎总是有一个域对象想要创建另一个域对象,这两个域对象都有状态和行为。

例如,给定一个媒体文件,我们希望将其编码为不同的格式 - 媒体 Assets 调用转码服务并接收回调:

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 之类的东西来注入(inject)它们,那么我必须使用 AOP 才能让我的程序运行,但我没有这样做喜欢。
  • 如果我想对 MediaAsset 进行单元测试以测试新格式是否已移至临时存储,我该怎么做?我无法模拟再现类来验证它是否调用了它的方法...将创建真正的再现类。

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

这里有没有我遗漏的方法,或者我只是做错了?

最佳答案

我认为在这种情况下注入(inject) RenditionFactory 是正确的方法。我知道这需要额外的工作,但你也从你的类(class)中删除了 SRP 违规行为。在业务逻辑中构造对象通常很诱人,但我的经验是对象或对象工厂的注入(inject)在 100 次中有 99 次得到返回。特别是如果提到的对象很复杂,和/或如果它与系统资源交互。

关于java - 领域驱动设计 - 可测试性和 "new"关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13581897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com