DDD 中的 DTO 和 Command 有什么区别?

Nal*_*chu 6 command domain-driven-design dto

我是DDD 领域驱动开发实施的新手。我从网上查看了一些项目源代码,他们使用 DDD 模式实现了这些源代码。在项目结构中,我发现了DTO以及Commands。我需要了解这两者之间有什么区别?这不是代码重复吗?

下面是项目中存在的两个 DTO 和 Command 示例类。

public class BookCargoCommand {
    private String bookingId;
    private int bookingAmount;
    private String originLocation;
    private String destLocation;
    private Date destArrivalDeadline;

    public BookCargoCommand(){}

    public BookCargoCommand(int bookingAmount,
                            String originLocation, String destLocation, Date destArrivalDeadline){

        this.bookingAmount = bookingAmount;
        this.originLocation = originLocation;
        this.destLocation = destLocation;
        this.destArrivalDeadline = destArrivalDeadline;
    }

    public void setBookingId(String bookingId){ this.bookingId = bookingId; }

    public String getBookingId(){return this.bookingId;}
    public void setBookingAmount(int bookingAmount){
        this.bookingAmount = bookingAmount;
    }


    public int getBookingAmount(){
        return this.bookingAmount;
    }


    public String getOriginLocation() {return originLocation; }

    public void setOriginLocation(String originLocation) {this.originLocation = originLocation; }

    public String getDestLocation() { return destLocation; }

    public void setDestLocation(String destLocation) { this.destLocation = destLocation; }

    public Date getDestArrivalDeadline() { return destArrivalDeadline; }

    public void setDestArrivalDeadline(Date destArrivalDeadline) { this.destArrivalDeadline = destArrivalDeadline; }
    }
Run Code Online (Sandbox Code Playgroud)

public class BookCargoResource {

    private int bookingAmount;
    private String originLocation;
    private String destLocation;
    private LocalDate destArrivalDeadline;

    public BookCargoResource(){}

    public BookCargoResource(int bookingAmount,
                             String originLocation, String destLocation, LocalDate destArrivalDeadline){

        this.bookingAmount = bookingAmount;
        this.originLocation = originLocation;
        this.destLocation = destLocation;
        this.destArrivalDeadline = destArrivalDeadline;
    }


    public void setBookingAmount(int bookingAmount){
        this.bookingAmount = bookingAmount;
    }


    public int getBookingAmount(){
        return this.bookingAmount;
    }

    public String getOriginLocation() {return originLocation; }

    public void setOriginLocation(String originLocation) {this.originLocation = originLocation; }

    public String getDestLocation() { return destLocation; }

    public void setDestLocation(String destLocation) { this.destLocation = destLocation; }

    public LocalDate getDestArrivalDeadline() { return destArrivalDeadline; }

    public void setDestArrivalDeadline(LocalDate destArrivalDeadline) { this.destArrivalDeadline = destArrivalDeadline; }

    }
Run Code Online (Sandbox Code Playgroud)

注:由于我找不到确切的问题,所以我提出了它。如果 StackOverflow 中存在类似的问题,请有人告诉我。

afh*_*afh 2

DTO(数据传输对象)更像是一个技术概念,指的是仅专用于表示属于一起的数据并用于将这些数据从一个地方传输到另一个地方的类。

从技术上讲,此上下文中的命令是DTO。但它也代表了在业务领域中具有特殊含义的事物——将要发生的事物,即要在系统中执行的命令。

因此,该命令可以被视为将发生什么以及系统接收部分执行该预期操作所需的所有数据。

该命令可以包含原始数据字段或更复杂的数据(也可能是某些 DTO)。

因此,关于您关于重复的问题,我将如何对您的命令和货物 DTO 进行建模:

public class BookCargoCommand {

    private String bookingId;
    private CargoResource cargo;

    public BookCargoCommand() {}

    public BookCargoCommand(String bookingId, CargoResource cargo) {
        this.bookingId = bookingId;
        this.cargo = cargo;
    }

    public String getBookingId() {
        return this.bookingId;
    }

    public CargoResource getCargo() {
        return this.cargo;
    }
}
Run Code Online (Sandbox Code Playgroud)

public class CargoResource {

    private int bookingAmount;
    private String originLocation;
    private String destLocation;
    private LocalDate destArrivalDeadline;

    public CargoResource(
            int bookingAmount,
            String originLocation,
            String destLocation,
            LocalDate destArrivalDeadline
    ) {
        this.bookingAmount = bookingAmount;
        this.originLocation = originLocation;
        this.destLocation = destLocation;
        this.destArrivalDeadline = destArrivalDeadline;
    }

    public int getBookingAmount() {
        return this.bookingAmount;
    }

    public String getOriginLocation() {
        return originLocation;
    }

    public String getDestLocation() {
        return destLocation;
    }

    public LocalDate getDestArrivalDeadline() {
        return destArrivalDeadline;
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:相同的概念也适用于事件(代表系统中发生的事情)

旁注:从我的角度来看,DTO 是不结合数据行为的类的唯一例外。在其他用例中,我会考虑将此类类视为贫血(另请参阅贫血域模型