如果领域包含技术,技术可以成为领域模型的一部分吗?

Can technology be part of the domain model if the domain includes the technology?

我有一个专门处理创建、编辑和生成包含业务相关数据的 Word 文档的领域。我还有一个包含 OpenXML SDK (.net) 并为 WordDocument 提供高级 API 的库。

我的用例是用户可以创建这样一个 word 文档(通过相应的 WPF UI),为其提供一些自定义业务相关数据(例如插入图像和文本),然后最后保存更改并销毁实例。所以我需要跟踪 word 文档的内存实例来处理所有这些。

现在遵循 DDD 方式,通常我不希望任何技术泄漏到我的域模型中,但我需要在我的文档聚合上有行为(如 Open()、Save()、FeedData() 等) .) 当然需要将其应用于这样的单词实例。

如果不在我的域中引用该库,该文档实例应该驻留在何处?我相应的应用服务是否应该处理这样的成员实例?但这看起来很奇怪,因为通常我的服务是无状态的,只会协调我的实体的行为。

我强烈希望将所需技术视为我领域的一部分,在与我们的领域专家交谈时,我们实际上是在谈论 "word documents",因此它是无处不在的语言的一部分。如果我的假设让我误入歧途,我会感到有点困惑。

我想我的问题是,如果领域(及其语言)包含技术,技术是否可以成为领域模型的一部分?

Can technology be part of the domain model if the domain includes the technology?

如果你不按照他们的期望去做,DDD 警察是不会来找你的。

领域模型(业务逻辑的表达)和应用程序(协调业务逻辑和我们在数字世界中工作所需的管道)之间的 DDD 有一个重要的边界).

分离的动机:域逻辑是独立于应用程序逻辑的关注点 - 我们应该能够 "lift and shift" 域代码从一个应用程序到另一个应用程序(从自定义桌面应用程序到 Web网站,例如);应用程序代码往往会因与域代码不同的原因而发生变化。

此外,在域逻辑中工作时,将所有应用程序关注点从上下文中移除对编程过程很有帮助 - 在我们的域代码中,我们应该专注于 "what happens in the business when the customer places an order",而不是被一堆应用程序问题分散注意力,比如 "how do I fetch their order history from the database?"

关于您的文档的一个重要问题 - 是 data on the outside? or data on the inside 吗?

如果它是外部数据 - 意味着您的域模型之外的某个人负责内容(例如:人类作者正在编写文档),那么您的域模型可能不关心文档全部.

如果它是内部数据 - 意味着您的域模型负责文档的内容,那么您的模型就会知道一些关于它的事情。不一定 load/save -- 您的模型可能不太关心您使用的持久性解决方案,但肯定会更改文档模型本身。

您可能可以与电子邮件进行类比——领域模型可能知道电子邮件的内容、收件人的地址以及邮件应该安排的时间,但是领域模型可能 包括 SMTP 客户端(这通常是应用程序或基础设施问题)。