在领域驱动设计中将通用序列化类放在哪里?

Posted

技术标签:

【中文标题】在领域驱动设计中将通用序列化类放在哪里?【英文标题】:Where to put general purpose serialization class in domain driven design? 【发布时间】:2016-07-31 07:58:54 【问题描述】:

我试图在我的设计中遵循 DDD 原则,并且我试图保持我的域实体干净。我必须创建序列化程序类(它使用 json.net),但我不知道把它放在哪里。 我考虑了以下选项:

创建一个公用事业项目很容易,但它只会在洋葱中产生一个尖峰。 它有点类似于存储库,因为它包含实际实现并具有依赖关系(就像 repo 使用 EF),但它不存储对象,只是转换它。 它不是域服务,因为它不包含业务逻辑 将其放入应用程序或 UI 等外层对我来说没有太大意义。

这是我的项目结构:

网络


应用


域服务

存储库


领域模型

【问题讨论】:

它是基础架构的一部分(存储库和其他外部服务,如果您需要的话) 我很确定,因为基础设施是最顶层(或环),层应该只使用它们下面的那些。也许如果我创建一个接口并将其放在应用程序核心的某个地方,并将实现放在可以工作的基础设施中。你怎么看? 【参考方案1】:

一般基础架构代码不在特定的物理层或逻辑层中表示。相反,它可用于您的所有代码。

考虑您的语言/平台标准库中的代码。它代表了随处可用的基础设施和功能代码。

“它不是域服务,因为它不包含业务逻辑”

域服务不包含业务逻辑。

您描述了一个复杂的技术层/层“堆栈”。如果不能证明其合理性,则不代表良好做法。

【讨论】:

【参考方案2】:

如果您使用洋葱架构,则意味着您使用接口来避免从中间环到外部基础架构的硬依赖;并且实际的实现是在运行时注入的。

序列化功能是一个基础设施问题,所以逻辑属于那里,但是从你的领域层你可以针对它的接口进行编程,所以你不依赖于实际的序列化实现,这是洋葱架构的全部思想: 如果以后序列化方法发生变化,它只会影响基础设施层。

【讨论】:

以上是关于在领域驱动设计中将通用序列化类放在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

领域驱动设计和工厂类的作用

重读领域驱动设计——如何说好一门通用语言

领域驱动设计--战术模式简介

业务中台与领域驱动架构设计

领域驱动设计 - 战略设计 - 2/2核心域提取和模型能力设计

领域驱动设计的必要性和模型标准——《领域驱动设计-精简版》