如何在持久化之前处理域实体验证?

一个实体(比方说一个UserEntity)对它的属性有严格的规则,它可以存在于两种状态 - 持久化(意味着它有一个id )和预先持久化(这意味着它还没有一个id )。

根据关于如何处理所需属性的这个问题的答案,一个“真正的”UserEntity应该只能通过传递给它的构造函数的id来创建。

但是,当我需要从浏览器发送的信息创建一个new UserEntity ,我需要能够在持久化到db之前验证信息。

过去,我只是简单地创建一个空白的UserEntity(没有一个id ),设置新的属性并验证它 - 但是,以这种新的,更安全的思考实体的方式,我不应该创建一个新的UserEntity没有它的id

我不想创建两个知道如何验证我的UserEntity属性的地方,因为如果它们改变了(他们会改变),它将是更新代码的两倍,并且增加错误的几率。

如何有效地集中我的实体属性的验证知识?

注意

我有一个想法反映在这个问题中,我考虑将非状态属性(如电子邮件,密码和名称)存储在一个标准化的值对象中,以便了解其属性的规则,即不同的服务(如Controller,Validator,和回购,或者Mapper可以使用。


这是工厂的目的。 在工厂方法中,您仅传递实施UserEntity的实际不变量所需的数据(需要一些时间来弄清楚UserAntity的实际不变量,并且最好与您的领域专家一起完成)。

在工厂方法中,您创建一个新的Id并将其传递给UserEntity构造函数。

在这个阶段,我认为如果构造函数内部的验证失败,那么放弃实例就不好。 在最糟糕的情况下 - 你失去了一个ID ...假设经常发生的情况并非如此 - 大多数情况下数据应该在客户端进行验证。

当然,另一种选择是在工厂方法中,首先验证参数,然后创建一个新的Id并将其传递给UserEntity构造函数。

itzik saban


我认为你有几个选择需要考虑:

(1)考虑你的第一个评论:

一个实体(比方说一个UserEntity)对它的属性有严格的规则,它可以存在于两种状态 - 持久化(意味着它有一个id)和预先持久化(这意味着它还没有一个id)。

在这里,你已经提到验证实际上取决于实体是否被持久化。 换句话说,如果实体没有被持久化,那么它应该是没有ID的有效的。 如果你继续这个领域的规范,我觉得验证应该采取相应的行动(例如,如果对象没有被持久化,则返回isValid,即使没有ID也是如此)

(2)如果你认为“有效”意味着对象有一个ID,那么你需要在创建时生成ID。 取决于你的ID如何生成,这可能会变得棘手(例如保存到数据库并返回创建的ID,或者以某种方式生成唯一标识符,或...)

使用这两种方法,可能值得为您的实体(例如ID)实施通用基类,以帮助最大限度地减少在不同州的重复验证。 希望这也能保护派生实体免受通用验证。


在我看来,save()和load()方法应该同时进行验证和设置ID属性。 顺便说一下,没有身份属性的实体根本就不是一个实体。

在我看来,身份属性应该在实体处于运输状态时进行验证和确保,例如

从数据库加载,从文件加载或(之后)保存到数据库,以便

如果从数据库加载失败放弃实体保存到数据库/文件失败放弃该实体。

由于验证是商业日志/行为等,并为此更好的模式

策略模式(http://en.wikipedia.org/wiki/Strategy_pattern)

链接地址: http://www.djcxy.com/p/61451.html

上一篇: How to handle Domain Entity validation before it's persisted?

下一篇: Is it okay to store a domain entity's mutable properties as a value object?