在领域驱动设计中将通用序列化类放在哪里?
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】:如果您使用洋葱架构,则意味着您使用接口来避免从中间环到外部基础架构的硬依赖;并且实际的实现是在运行时注入的。
序列化功能是一个基础设施问题,所以逻辑属于那里,但是从你的领域层你可以针对它的接口进行编程,所以你不依赖于实际的序列化实现,这是洋葱架构的全部思想: 如果以后序列化方法发生变化,它只会影响基础设施层。
【讨论】:
以上是关于在领域驱动设计中将通用序列化类放在哪里?的主要内容,如果未能解决你的问题,请参考以下文章