Entity
對于Entity,區(qū)別于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這樣的屬性,用來作為獨一無二的標識,其中標識可以在對象創(chuàng)建的時候生成,也可以在持久化對象的時候生成。
Value Object
首先針對Entity以及Value Object,我們應該盡量使用的是值對象而非實體。如果將所有的的對象創(chuàng)建實體,每一個實體的屬性都映射到數(shù)據(jù)庫中,并且為每個屬性設置相應的setter以及getter,會變得異常復雜,并且浪費時間。
相反的,值對象可以在創(chuàng)建對象化之后直接處理掉,不用擔心客戶端對值對象的修改問題。
對于值對象,它不應該成為領域內的某一個東西,而僅僅是描述領域內的一個概念。
當值對象創(chuàng)建出來之后,就不應該再去修改,也就是值對象的不變性。
對于簡單代碼而言
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
領域中的服務表示無狀態(tài)的操作,用于實現(xiàn)某個特定領域的任務。當操作不適合放在聚合中或者ValueObject中的時候,此時就應該放置在領域服務中。
其中領域服務并不是業(yè)務服務,業(yè)務服務并不會處理到業(yè)務邏輯,而領域服務恰恰是處理業(yè)務邏輯的。
一些明確無狀態(tài)的操作就可以劃分到領域服務中去,如下
class DomainService {
constructor() {
super()
}
}
class queryService extends DomainService {
static async getTransaction(){
...
}
}
查詢操作就可以劃分到領域服務中去。