3

我最近收到了 Scott Miller 和 Nick Tune 的《领域驱动设计的模式、原则和实践》一书。它在 C# 中有一些不错的示例,因此与我之前读过的其他 DDD 书籍有点不同,后者是 Java 中的。由于 C# 对委托和事件的支持,域事件实现非常简洁。

然而,有一点让我担心,正如书中应用服务一章所说,它应该是“程序化的风格和精简的”。我知道应用程序层应该是薄的,但为什么程序风格?我不想编写程序代码,否则我一开始就不会选择 DDD。我还发现这篇 stackoverflow 文章还标签应用程序服务是过程代码:

https://softwareengineering.stackexchange.com/questions/279369/conceptual-mismatch-between-ddd-application-services-and-rest-api

所以你看?应用程序服务在风格上是程序化的,而不是 OOP。这让我想知道我是否可以通过将应用程序服务的过程接口替换为 OO 接口来改进设计以使其更加 OO。本文建议方法对象会这样做,它是否有效?程序应用程序服务的更多 OO 替代方案是什么?谁能详细说明?

http://ayende.com/blog/2145/entities-services-and-what-goes-between-them

4

2 回答 2

8

应用程序服务在该术语的编程范式意义上不是过程性的。它是一个封装数据(对其协作者对象的引用)和行为的对象——协调对这些协作者的调用

它可能在精神上看起来是程序性的,因为有一系列动作,但是当有一个应用任务意味着许多步骤时,例如:

  • 从存储库中获取域对象
  • 调用该对象的方法
  • 保存对象

无论编程范式如何,您都无法摆脱这种程序性/顺序性。

例如,即使您使用的是面向对象的责任链模式,每个步骤都由链中的一个单独的参与者执行,您仍然需要一个知道如何正确组装链的“主”对象顺序,因此根据定义知道程序,因此它同样具有程序性。

于 2015-10-17T17:41:17.570 回答
1

OO 世界中的所有方法都是程序性的 :)

我认为作者试图传达的是将应用程序服务实现为操作脚本。因此,它只是将域和基础设施的各种其他位作为一组顺序调用进行协调。理想情况下,事务边界也在应用程序服务层中处理。

也许Martin Fowler 的服务层文章会提供更多信息。

您可能会将结构化编程与过程代码混淆:)

于 2015-10-17T09:11:13.197 回答