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(){
...
}
}
查询操作就可以划分到领域服务中去。