使用Automapper时的有效域模型

时间:2016-04-28 17:27:30

标签: domain-driven-design automapper domain-model

我正在使用Jimmy Bogard可爱的Automapper将我的API模型映射到POCO类(域模型)。 API模型不包含域模型的某些属性,这些属性是域模型处于有效状态所必需的。在这种情况下,当Automapper完成其工作时,我有一个完全构造的域模型处于无效状态。 不使用Automapper不是一种选择,因为手动代码的属性太多了。

所以,这是我的问题:

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

由于

3 个答案:

答案 0 :(得分:1)

评论可能太长了:

尽管Jimmy的答案是正确的,但可能暗示您的设计可能不会像它可能那样封装,因为您将不得不暴露很多状态。这可能就是为什么有关于“贫血”模型和“不适合目的”的评论。

如果您专注于行为,那么您可能会有一些完全假设的内容,如下所示,以使您的客户成为 Gold 客户:

customer.MakeGold();

但是,使用州,您现在必须公开允许您映射到 Gold 状态的属性。在内部,您的客户可能已经检查了某些其他状态以确定 Gold 状态的有效性,而有效性检查现在已经移出域,就像Jimmy说他确定的那样在将状态传递给域之前状态是正确的。

这不是一个自动映射器问题,因为它是一个设计问题。它似乎也表明您的API / Integration模型可能更加以数据为中心。

另一方面,如果要映射到传递给域的命令式值对象,它可能没有那么糟糕:)

// map my APIActivationDetails to Activate --- however automapper does this :)

var activate = AutoMapper.Map<Activate>().From(apiActivationDetails);

customer.Activate(activate);

来想一想......这似乎是吉米所说的:P

答案 1 :(得分:1)

  

&#34;将我的API模型映射到POCO类(域模型)&#34;

为什么要将命令对象(您的API模型)属性映射到域对象?如果您的目标是最终将使用过度设计的CRUD,但肯定不是DDD解决方案。

应该在聚合上显式声明行为,并且聚合负责根据它们保护的业务不变量来改变自己的内部状态。

通过这种方式,域模型客户可以清楚地表明他们的意图,并且这种意图不会因业务流程而丢失。

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

答案 2 :(得分:0)

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