在应用程序服务参数中使用普适语言

时间:2018-09-21 06:40:33

标签: service parameters arguments domain-driven-design

泛型语言(UL)用于整个受限上下文中,领域模型和应用程序层对吗?好。然后,应用服务的方法的名称属于UL。但是该方法的论点(不应将域对象暴露给用户)不会成为UL的术语。如果您使用UL词汇表命名方法args,那么您将在应用程序外部公开域对象。

您如何解释有关命名应用程序服务参数的矛盾?

也许这个问题似乎有点哲学性,但是DDD也是如此,它是软件开发的一种哲学,它是基于UL的。

更新

有人要求举一个例子,而不仅仅是哲学。好吧,假设我们的域名是关于一家销售产品的商店。应用程序服务的一种方法可能是:

addProductToShoppingCart(产品产品,ShoppingCart shoppingCart);

但是Product和ShoppingCart是域模型的实体/值对象,我们不应将其公开给客户。

因此,args应该是DTO或原始类型。但是这些类型不属于UL。 Product和ShoppingCart确实属于UL,应该是该方法的args,但是这样做会违反将域暴露给客户的规则。

2 个答案:

答案 0 :(得分:1)

我认为应用程序服务层应尽力反映UL,而不会泄漏域模型技术解决方案的细节。换句话说,您希望使用通用语言的术语来表示应用程序服务公共API,但是您不希望将客户端代码耦合在域模型层上。

  

“如果使用UL词汇为方法args命名,那么您将在应用程序外部公开域对象。”

这是一个误解:方法参数应该使用UL术语命名,但参数类型不应利用在域包中定义的类型。这仅出于技术原因,因为隔离使您可以独立于公共应用程序的API来更改域模型。

答案 1 :(得分:0)

一个例子比“哲学”要好得多。但是..

矛盾之处在于,大多数DDD设计实际上并不严格遵循UL。查看几乎所有公开可用的“ DDD”设计,例如Vaughn Vernon's Github repository

“域”(即值对象和实体)通常建模为仅数据的“对象”,几乎没有业务逻辑。此处的方法名称已经离开了UL,并且纯粹在技术领域(通常是设置程序,获取程序)。

与服务相同。服务根本不是“域”的一部分。尝试告诉业务人员您已经实施了PasswordService,我保证您会一无所获。服务在外部也纯属技术,其中包含一些与业务相关的方法,这些方法实际上可能属于某个Value Object或Entity。

因此,尽管我同意“哲学”部分,但埃里克·埃文斯(Eric Evans)定义的今天所使用的构建模块远非该哲学的最佳实现。

看看我有关此问题的演示文稿:https://speakerdeck.com/robertbraeutigam/object-oriented-domain-driven-design