DDD,如何将对象从基础设施层转换到领域层?

问题描述 投票:0回答:1

我现在在 DDD 项目结构中使用 DIP,这意味着域层拥有接口,基础设施层拥有实现,当然我从域层到基础设施层没有任何依赖关系。

基础设施实现应该返回域层中定义的域对象,但我不能这样做,因为:

  1. 域层不依赖于基础设施层,因此我无法使用工厂或构造函数创建域对象,因为我无法将 DO 或 DTO 传递给域层!

  2. 另外,我不认为使用 AllArgsConstructor 是一个好主意,因为我有超过 10 个属性,可能只有 1-5 个属性就可以了。

  3. 我很确定我不应该为我的域对象属性创建任何 setter 方法,并且某些属性也应该是 Final!

所以,这是我的问题:如何将基础设施层中定义的对象转换为域层中定义的域对象,因为基础设施层不依赖于域层?

// Domain layer
class DomainObject {
    // error because the infrastructure layer is not a dependency to the domain layer
    public DomainObject(SomeDTO dto) {}
    // all args constructor is not a good idea when I have too many properties in my object
    public DomainObject(...) {}
}

interface InterfaceA {
    DomainObject getDomainObjectFromSomewhere() {}
}
// Infrastructure layer
class InterfaceAImpl implements InterfaceA {

    public DomainObject getDomainObjectFromSomewhere() {
        SomeDTO dto = ... // query from other api or database
        return convertSomeDTOToDomainObject(dto);
    }

    private DomainObject convertSomeDTOToDomainObject(SomeDTO dto) {
        // what is the best way to covert this dto to a DomainObject?
    }
}

class SomeDTO {}

我尝试在我的域对象中创建一个 Builder 类,这样我就不必将 DTO 或 DO 传递到我的域层,我想知道这样做是否是好的做法以及什么是最好的方法是什么?

提前致谢。

domain-driven-design
1个回答
0
投票

您不能使用类似 AutoMapper 之类的工具简单地从一个映射到另一个吗?

这是一种非常常见的模式,在从 HTTP 请求映射到域对象时经常看到。

© www.soinside.com 2019 - 2024. All rights reserved.