领域层逻辑放置与系统整体性能的平衡问题
DDD领域层业务逻辑放置的困惑
我正在用Node.js+TypeScript开发首个DDD应用,遵循先构建领域层、再开发仓储/数据库及应用层的流程,同时为每个实体编写单元测试。随着领域层开发推进,我对业务逻辑的放置产生了疑问,以下是具体场景:
场景一:创建标签的逻辑实现
业务规则:请求方(Requester)可以创建标签。我在Requester实体中实现了createSectorTag方法,代码如下:
public createSectorTag(data: ISectorTagData): number { this.checkIfIsActive() const sector_tag = new SectorTag(data) return this.sector_tags.push(sector_tag) }
这个方法会创建SectorTag实体并添加到Requester的私有数组中,其中包含checkIfIsActive()的校验逻辑——我认为这部分放在领域层是合理的,但担心操作过于繁琐:每次调用领域层添加标签时,都需要先创建Requester实体,添加标签后还要通过仓储将新的SectorTag持久化到数据库。
场景二:删除标签的逻辑校验
业务规则:删除标签时,需要校验请求方的所有请求是否关联了待删除的标签,若存在关联则抛出异常。我在Requester实体中定义了deleteSectorTag方法:
public deleteSectorTag(index: number): void { /** * 这里需要检查请求实体中的所有请求是否包含参数指定索引对应的标签,若存在则抛出异常 */ this.sector_tags.splice(index, 1) }
同样,我认为这类业务逻辑放在领域层是符合DDD理念的,但会增加处理负担:需要从数据库加载请求方的所有请求,创建Requester实体并注入请求后才能完成校验。而这类校验似乎可以直接通过数据库查询实现,这让我担忧系统性能。
我认可将所有逻辑放在领域层的理念,这能让代码更贴近业务实际,但同时也担心性能问题,希望得到相关建议。
完整的Requester实体代码
import { BudgetRequest, SectorTag, BudgetEstimator } from '@/domain/BudgetRequest/entities' import { RequesterIsInactiveError } from '@/domain/BudgetRequest/exceptions' import { IBudgetRequestData, IRequesterData, ISectorTagData, } from '@/domain/BudgetRequest/interfaces' export class Requester { private readonly active: boolean private readonly name: string private readonly cnpj: number private budget_requests: Array<BudgetRequest> = [] private sector_tags: Array<SectorTag> = [] private budget_estimators: Array<BudgetEstimator> = [] constructor(data: IRequesterData) { this.active = data.active this.name = data.name this.cnpj = data.cnpj } get budgets_list(): Array<BudgetRequest> { return [...this.budget_requests] } get sector_tags_list(): Array<SectorTag> { return [...this.sector_tags] } public createBudgetRequest(data: IBudgetRequestData): number { this.checkIfIsActive() const budget_request: BudgetRequest = new BudgetRequest(data) return this.budget_requests.push(budget_request) } public createSectorTag(data: ISectorTagData): number { this.checkIfIsActive() const sector_tag = new SectorTag(data) return this.sector_tags.push(sector_tag) } public deleteSectorTag(index: number): void { /** * 这里需要检查请求实体中的所有请求是否包含参数指定索引对应的标签,若存在则抛出异常 */ this.sector_tags.splice(index, 1) } public bindSectorTagToBudgetRequest(i: number, j: number): void { this.budget_requests[i].addSectorTag(this.sector_tags[j]) } private checkIfIsActive(): void { if (!this.active) { throw new RequesterIsInactiveError() } } }
内容的提问来源于stack exchange,提问作者Bernardo Benini Fantin
相关产品推荐
相关产品推荐

