Value Object & Entity & Domain Service

Entity

对于Entity,区别于Value Object的地方在于Entity有着唯一的标示,可以认为是其实体的ID,辨识其为独一无二的,但是其余方面Entity又和Value Object很类似,具体以代码形式来看。
首先对于Entity

class Entity {
    constructor(id) {
        super();
        this.id = id
    }

    get id() {
        return this._id;
    }
    set id(value) {
        this._id = value;
    }
}
class Business extends Entity {
    constructor(options = {}) {
        const {
            amount, date, status
        } = options;
        // 从父类继承id属性,用来表示Entity的独一性 
        super(id);
        this.amount = amount;
        this.date = date;
        this.status = status;
    }

    get amount() {
        return this._amount;
    }
    set amount(value) {
        this._amount = value;
    }

    get date() {
        return this._date;
    }
    set date(value) {
        this._date = value;
    }

    get status() {
        return this._status;
    }
    set status(value) {
        this._status = value;
    };
}

首先是定义基本属性,并且从Entity继承了ID这样的属性,用来作为独一无二的标识,其中标识可以在对象创建的时候生成,也可以在持久化对象的时候生成。

Value Object

首先针对Entity以及Value Object,我们应该尽量使用的是值对象而非实体。如果将所有的的对象创建实体,每一个实体的属性都映射到数据库中,并且为每个属性设置相应的setter以及getter,会变得异常复杂,并且浪费时间。
相反的,值对象可以在创建对象化之后直接处理掉,不用担心客户端对值对象的修改问题。
对于值对象,它不应该成为领域内的某一个东西,而仅仅是描述领域内的一个概念。
当值对象创建出来之后,就不应该再去修改,也就是值对象的不变性。
对于简单代码而言

class ValueObject {
    constructor() {
        super()
    }
}

class Business extends ValueObject {
    constructor(options = {}) {
        const {
            amount, date, status
        } = options;
        // 从父类继承id属性,用来表示Entity的独一性 
        super();
        this.amount = amount;
        this.date = date;
        this.status = status;
    }

    get amount() {
        return this._amount;
    }
    set amount(value) {
        this._amount = value;
    }

    get date() {
        return this._date;
    }
    set date(value) {
        this._date = value;
    }

    get status() {
        return this._status;
    }
    set status(value) {
        this._status = value;
    };
}

没有ID属性,也就缺失了独一无二的特性

Domain Service

领域中的服务表示无状态的操作,用于实现某个特定领域的任务。当操作不适合放在聚合中或者ValueObject中的时候,此时就应该放置在领域服务中。
其中领域服务并不是业务服务,业务服务并不会处理到业务逻辑,而领域服务恰恰是处理业务逻辑的。
一些明确无状态的操作就可以划分到领域服务中去,如下

class DomainService {
    constructor() {
        super()
    }
}
class queryService extends DomainService {
    static async getTransaction(){
        ...
    }
}

查询操作就可以划分到领域服务中去。

你可能感兴趣的:(Value Object & Entity & Domain Service)