gpt4 book ai didi

java - DDD - 复合聚合序列化 - 设计问题

转载 作者:行者123 更新时间:2023-11-30 05:28:30 24 4
gpt4 key购买 nike

我正在尝试将 DDD 应用于一个 Java 项目。这是我偶然发现的问题:

在域中,我有一个使用复合 OOP 模式实现的聚合。该聚合上的方法会生成一些需要序列化并通过线路发送的域对象。这些是我考虑过的选项:

  1. 在我的域的应用程序服务部分中,我正在进行聚合,调用它的方法,并尝试将结果序列化到 DTO。为了将其序列化为 DTO,我必须使用 instanceof 来检查当前节点是复合节点还是子节点,然后继续序列化。由于 instanceof 是代码味道(因为我读到它违反了打开/关闭原则等),所以我决定尝试使用访问者模式。

  2. 为了应用访问者模式,我的复合聚合必须实现访问者,它将返回 DTO,然后 DTO 成为域层的一部分 - 这也不是一个好的设计(因为域应该只包含域概念,并且 DTO 的不属于其中)。 DTO 序列化只是技术细节,不应该进入领域层。

还有其他不违背这些设计原则的解决方案吗?

有没有办法在java中模拟重载方法的动态绑定(bind)(除了instanceof - 因为这可以解决我使用选项1的问题)?

最佳答案

如果访问者具有通用返回类型,则访问的类不会与该类型耦合。

public interface Node {
<T> T accept(NodeVisitor<T> visitor);
}

public class ANode implements Node {
@Override
public <T> T accept(NodeVisitor<T> visitor) {
return visitor.visit(this);
}
}

public class BNode implements Node {
@Override
public <T> T accept(NodeVisitor<T> visitor) {
return visitor.visit(this);
}
}

public interface NodeVisitor<T> {
T visit(ANode aNode);
T visit(BNode bNode);
}

public class DtoNodeVisitor implements NodeVisitor<DTO> {
@Override
public DTO visit(ANode aNode) {
return new DTO(); //use ANode to build this.
}
@Override
public DTO visit(BNode bNode) {
return new DTO(); //use BNode to build.
}
}

ANodeBNode 这里不了解 DTO

关于java - DDD - 复合聚合序列化 - 设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58035445/

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