Domain driven design 如何将验证规则放入存储库

Domain driven design 如何将验证规则放入存储库,domain-driven-design,aurelia,Domain Driven Design,Aurelia,我有一个包含验证规则的实体。它起作用了。但是,实体似乎不是存储此类规则的最佳位置,因为如果我有一个包含100个实体的列表,那么代码会运行100次,这似乎是不必要的 因此,在我看来,保存规则的更好地方是存储库。我为每个实体都有一个存储库,它是一个单例 但问题是如何做到这一点 import { type, Entity, validatedResource, association, resource, repository } from 'aurelia-orm'; import { Valida

我有一个包含验证规则的实体。它起作用了。但是,实体似乎不是存储此类规则的最佳位置,因为如果我有一个包含100个实体的列表,那么代码会运行100次,这似乎是不必要的

因此,在我看来,保存规则的更好地方是存储库。我为每个实体都有一个存储库,它是一个单例

但问题是如何做到这一点

import { type, Entity, validatedResource, association, resource, repository } from 'aurelia-orm';
import { ValidationRules } from 'aurelia-validation';
import { InviteRepository } from 'data/service/invite-repository';
import { autoinject } from 'aurelia-framework';
import { autoinject } from 'aurelia-framework';


@resource()
@repository(InviteRepository)
@validatedResource()
@autoinject()
export class Invite extends Entity {
repository: any;

    id: number;
    firstName = null;
    lastName = null;
    email = null;
    message = null;
    invitedOn: Date;

    constructor() {
        super();

        ValidationRules
            .ensure('firstName').required().satisfies(
                (value)=> this.validateFirstName(value)
            ).withMessage("First Name must be Greg")
            .ensure('lastName').required()
            .ensure('email').email()
            .on(Invite);
    }

    validateFirstName(name: string): boolean {
        return this.getRepository().validateFirstName(this.firstName);
    }

}

有几种验证需要考虑。

第一种是正式验证,任何实体或价值都必须经过正式验证才能得到处理。如“此字段集中需要字段名”。或“名称不得为空”。等等此验证逻辑属于工厂或实体/值构造函数,不需要外部调用

另一种类型是根据系统的当前状态检查业务规则。例如,“您不能添加会使路由模棱两可的路由规则”。如果此逻辑涉及多个实体/聚合,则可以将其放入域服务中。或者,您可以将其放入实体中,前提是您从应用程序层调用它,并且手头有所有需要的外部数据,以做出验证决策

最后,在数据库级别有一些规则是用来保持数据一致性的。这些约束与DB约束自然匹配,属于存储库

因此,在您的情况下,似乎可以将其放入实体构造函数中