如何将验证规则放入存储库
How to Put Validation Rules in Repository
我有这个包含验证规则的实体。有用。但似乎实体不是存储此类规则的最佳位置,因为如果我有一个包含 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);
}
}
有几种类型的验证需要考虑。
首先是要处理任何实体或值都必须满足的正式验证。喜欢"field name is required in this fieldset"。或者 "name must be not empty"。等等。此验证逻辑属于工厂或 entity/value 构造函数,不需要外部调用。
另一种类型是检查有关系统当前状态的业务规则。例如 "you cannot add routing rule that would make routing ambigous"。如果涉及多个 entity/aggregate,您可以将此逻辑放在域服务中。或者你可以把它放在实体中,前提是你从应用程序层调用它,手头有所有需要的外部数据来做出验证决定。
最后,数据库级别的规则旨在保持数据的一致性。这些自然匹配数据库约束并属于存储库。
因此,在您的情况下,将其放入实体构造函数中似乎没问题。
我有这个包含验证规则的实体。有用。但似乎实体不是存储此类规则的最佳位置,因为如果我有一个包含 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);
}
}
有几种类型的验证需要考虑。
首先是要处理任何实体或值都必须满足的正式验证。喜欢"field name is required in this fieldset"。或者 "name must be not empty"。等等。此验证逻辑属于工厂或 entity/value 构造函数,不需要外部调用。
另一种类型是检查有关系统当前状态的业务规则。例如 "you cannot add routing rule that would make routing ambigous"。如果涉及多个 entity/aggregate,您可以将此逻辑放在域服务中。或者你可以把它放在实体中,前提是你从应用程序层调用它,手头有所有需要的外部数据来做出验证决定。
最后,数据库级别的规则旨在保持数据的一致性。这些自然匹配数据库约束并属于存储库。
因此,在您的情况下,将其放入实体构造函数中似乎没问题。