【问题标题】:Valid domain model while using Automapper使用 Automapper 时的有效域模型
【发布时间】:2016-08-23 15:01:52
【问题描述】:

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

所以,这是我的问题:

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

谢谢

【问题讨论】:

  • 你没有。 Automapper 不适合这种用途

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


【解决方案1】:

评论可能太长了:

虽然 Jimmy 的回答是正确的,但它可能暗示您的设计可能没有像它可能的那样封装,因为您将不得不公开很多状态。这可能就是为什么有围绕“贫血”模型和“不适合目的”的 cmets。

如果您专注于行为,那么您可能有一些完全假设的东西,如下所示,让您的客户成为黄金客户:

customer.MakeGold();

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

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

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

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

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

customer.Activate(activate);

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

【讨论】:

  • 是的,这就是我要说的。但该命令在应用程序边界进行验证,它还可以根据需要跨实体/聚合进行查看。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 在您的域中,您当然可以使用 AutoMapper,但前提是它有意义。我通常不会。
  • 你有一个有意义的例子吗?
  • 如果我只是在编辑数据而不是做一些非常行为上的事情。编辑发票与批准发票。
  • @JimmyBogard 好吧,编辑发票也可能是一系列行为操作:LineItemQuantityAdjusted、LineItemRemoved...等。如果你没有捕捉到意图,那么你只是在做 CRUD。 CRUD 可能没问题,但它根本不需要域模型。
【解决方案3】:

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

【讨论】:

  • 所以你更喜欢不总是有效的贫血域模型?
  • 不,我会在命令到达我的域模型之前对其进行验证,因此我的域模型始终有效。
  • 我同意可以在命令中执行一些琐碎的验证,但它是保护不变量的聚合角色。
  • 好的,这样您就可以使您的聚合“进行验证” - 但我警告您,验证框架可以很好地进行验证,而手动滚动对象则不能,并且从内部实体/聚合中显示验证错误真是太棒了.满足不变量并不一定要执行验证——它是关于正确的状态。
  • 这是一种看待它的方式,但这不是永远有效的范式。 codebetter.com/gregyoung/2009/05/22/always-valid
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多