【问题标题】:External third party API related to Entities in a DDD way以 DDD 方式与实体相关的外部第三方 API
【发布时间】:2015-10-26 14:05:22
【问题描述】:

我正在开发一个我们将使用 DDD 的新项目。这里的问题在于如何处理我认为外部 API 与一个实体本身非常相关的情况。

想象实体卡。每个用户都可以拥有一张卡,类似于银行塑料卡,需要创建、激活、收费等。

这里的问题是,这张卡与管理卡创建、退款、激活等的外部 API 有关。

以代码方式而不考虑我所看到的基础架构。

new Card();
$card->isActive();
$card->refund();

等等

但问题是,这个实体函数需要与真正创建所有这些动作的外部 API 联系。但对我来说,它看起来像基础设施,是领域模型本身之外的东西。

从 DDD 的角度来看,这些实体能够连接到 API 并调用内部的 API 是否正确?

使用做某事的服务不是接近 DDD:

$service->activateCard($card);

那么 $card->activate() 方法在我看来在无处不在的语言中如此自然,会发生什么?

谢谢!!

【问题讨论】:

  • 您最终找到了解决这个问题的好方法吗?

标签: php entity domain-driven-design


【解决方案1】:

想到域事件。您可以让Card 发出CardActivatedCardRefunded 事件和相关数据。它们将由知道如何与外部 API 对话的基础架构服务处理,而您的域层很高兴地不知道技术细节。

【讨论】:

  • 我唯一能看到的是,您必须在与用于持久化 AR 的事务相同的事务中处理事件。此外,我相信另一种方法,例如从应用程序服务调用 cardService 或将 ICanRefund 服务对象传递给 card.refund() 操作可能是有意义的。 PS:还没忘记联系你,只是还没来得及;)
  • 但是向实体注入如此依赖于基础架构的服务(第三方 API)是一种好习惯吗?
  • @JonathanGimeno 从技术上讲,只要注入这些服务,它仍然是松散耦合,所以我不会称之为不好的做法。但是,我觉得如果域实体不知道在其实体工作完成后必须调用的外部事物,则可以实现更好的关注点分离。
猜你喜欢
  • 2011-01-10
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多