我正在使用Jimmy Bogard可爱的Automapper将我的API模型映射到POCO类(域模型)。 API模型不包含域模型的某些属性,这些属性是域模型处于有效状态所必需的。在这种情况下,当Automapper完成其工作时,我有一个完全构造的域模型处于无效状态。 不使用Automapper不是一种选择,因为手动代码的属性太多了。
所以,这是我的问题:
如何使用automapper以这种方式创建对象,同时让域模型保持有效状态。
由于
答案 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模型上。