Domain driven design 使用自动映射时的有效域模型

Domain driven design 使用自动映射时的有效域模型,domain-driven-design,automapper,domain-model,Domain Driven Design,Automapper,Domain Model,我正在使用Jimmy Bogard可爱的Automapper将我的API模型映射到POCO类(域模型)。 API模型不包含域模型处于有效状态所必需的某些属性。在这个场景中,当Automapper完成它的工作时,我有一个完全构造的域模型处于无效状态。 不使用Automapper不是一个选项,因为有太多的属性需要手工编码 所以,我的问题是: 如何使用automapper以这种方式创建对象,同时保持域模型处于有效状态 谢谢无论是否使用AutoMapper,我都会在API模型映射到我的域模型之前验证它。

我正在使用Jimmy Bogard可爱的Automapper将我的API模型映射到POCO类(域模型)。 API模型不包含域模型处于有效状态所必需的某些属性。在这个场景中,当Automapper完成它的工作时,我有一个完全构造的域模型处于无效状态。 不使用Automapper不是一个选项,因为有太多的属性需要手工编码

所以,我的问题是:

如何使用automapper以这种方式创建对象,同时保持域模型处于有效状态


谢谢

无论是否使用AutoMapper,我都会在API模型映射到我的域模型之前验证它。API模型表示一个命令或操作,因此我在将命令应用于实体之前验证该命令,而不是对实体进行变异,然后再尝试验证它。这也意味着我的所有验证属性都在我的API模型上。

我在API模型映射到我的域模型之前验证它,无论我是否使用AutoMapper。API模型表示一个命令或操作,因此我在将命令应用于实体之前验证该命令,而不是对实体进行变异,然后再尝试验证它。这也意味着我的所有验证属性都在我的API模型上。

这可能太长,无法发表评论:

尽管Jimmy的回答是正确的,但这可能意味着您的设计可能没有像它可能的那样封装,因为您将不得不公开很多状态。这可能就是为什么会有关于“贫血”模型和“不适合用途”的评论

如果你专注于行为,那么你可能会有一些完全假设的东西,使你的客户成为黄金客户:

customer.MakeGold();
然而,使用状态,您现在必须公开允许您映射到黄金状态的属性。在内部,您的客户可能已经检查了某些其他状态,以确定黄金状态的有效性,而有效性检查现在已经从域中移出,正如Jimmy所说,他在将状态传递给域之前确保状态正确

这与其说是一个自动映射器问题,不如说是一个设计问题。这似乎还表明您的API/集成模型可能更以数据为中心

另一方面,如果要映射到(例如)交给域的命令样式值对象,则情况可能不会那么糟:)

//将我的APIActivationDetails映射到激活---但是automapper会这样做:)
var activate=AutoMapper.Map();
客户。激活(激活);

想想看。。。吉米似乎是这么说的:这可能太长了,无法发表评论:

尽管Jimmy的回答是正确的,但这可能意味着您的设计可能没有像它可能的那样封装,因为您将不得不公开很多状态。这可能就是为什么会有关于“贫血”模型和“不适合用途”的评论

如果你专注于行为,那么你可能会有一些完全假设的东西,使你的客户成为黄金客户:

customer.MakeGold();
然而,使用状态,您现在必须公开允许您映射到黄金状态的属性。在内部,您的客户可能已经检查了某些其他状态,以确定黄金状态的有效性,而有效性检查现在已经从域中移出,正如Jimmy所说,他在将状态传递给域之前确保状态正确

这与其说是一个自动映射器问题,不如说是一个设计问题。这似乎还表明您的API/集成模型可能更以数据为中心

另一方面,如果要映射到(例如)交给域的命令样式值对象,则情况可能不会那么糟:)

//将我的APIActivationDetails映射到激活---但是automapper会这样做:)
var activate=AutoMapper.Map();
客户。激活(激活);
想想看。。。这似乎是吉米说的:P

“将我的API模型映射到POCO类(域模型)”

为什么要将命令对象(API模型)属性映射到域对象?如果这就是你的目标,那么你最终会得到过度设计的积垢,但肯定不是DDD解决方案

行为应该在聚合上明确声明,聚合负责根据其保护的业务不变量改变其自身的内部状态

这样,域模型客户机就可以清楚地声明他们的意图,并且这种意图不会在业务流程中丢失

您不应该试图将数据推到聚合中,而是应该让它们执行一项任务

“将我的API模型映射到POCO类(域模型)”

为什么要将命令对象(API模型)属性映射到域对象?如果这就是你的目标,那么你最终会得到过度设计的积垢,但肯定不是DDD解决方案

行为应该在聚合上明确声明,聚合负责根据其保护的业务不变量改变其自身的内部状态

这样,域模型客户机就可以清楚地声明他们的意图,并且这种意图不会在业务流程中丢失


您不应该试图将数据推送到聚合中,而应该让他们执行一项任务。

您不应该这样做。Automapper不适合那种用途,你不需要。Automapper不适用于这种用途所以你不希望总是有效的贫血域模型?不,我在命令到达我的域模型之前验证命令,所以我的域模型总是有效的。我同意可以在命令中执行一些琐碎的验证,但是聚合的角色是保护不变量。好吧,这样你就可以让你的聚合“做验证”——但我警告你,验证框架做验证非常好,手工操作