DDD 基础设施服务

     2023-02-24     13

关键词:

【中文标题】DDD 基础设施服务【英文标题】:DDD Infrastructure services 【发布时间】:2010-11-25 22:06:43 【问题描述】:

我正在学习 DDD,我在基础设施层有点迷失。

据我了解,“所有好的 DDD 应用程序”都应该有 4 层:表示层、应用程序、域和基础架构。应使用存储库访问数据库。存储库接口应该在域层和存储库实现中 - 在基础架构中(参考 DDD: Where to keep domain Interfaces, the Infrastructure?)。

应用程序、域和基础设施层应该/可能有服务(参考 Services in Domain-Driven Design),例如,基础设施层中的 EmailService 发送电子邮件消息。

但是,在基础设施层内,我们有存储库实现,用于访问数据库。那么,在这种情况下,存储库是数据库服务吗?基础设施服务和存储库有什么区别?

提前致谢!

【问题讨论】:

【参考方案1】:

坚持 DDD 定义,存储库与服务不同。存储库直接与实体相关,通常是聚合根。服务定义了实际上不属于您域中单个实体的行为。您绝对可以在每一层中找到服务,尽管它们解决的问题类型因层而异,并且可能与 DDD 的概念服务不同。

在概念级别工作时,DDD 存储库与 DDD 服务的不同之处在于它专门与实体持久性相关联。服务可以解决您可能遇到的任何域、应用程序或基础架构问题。

您到处都会遇到与 DDD 的术语冲突。例如,DDD 存储库与 Martin Fowler 的 PoEAA 书中的Repository pattern 不同,尽管它可能采用这种模式。这通常是许多人困惑的根源。

如果您始终将领域模型置于您所做的一切的中心,这对 DDD 会有所帮助。说到分层 DDD 应用,我经常选择Jeffrey Palermo's Onion Architecture。看看这个。下载CodeCampServer,一个使用此架构的示例应用程序。我认为它非常适合 DDD 编程。

祝你好运!

【讨论】:

【参考方案2】:

也许这有助于了解潜在的项目结构。

可能的组装或封装结构:

项目.域 项目.基础设施.数据 项目.基础设施.组件 项目.基础设施.服务

可能的命名空间或文件夹结构:

项目.域 -n- 模块 ----n- 帐户 --------f- Account.xx --------f- AccountRepository.xx --------f- Contact.xx -n- 营销 --------f- RegionRepository.xx -n- 共享 -n- 服务

Project.Infrastructure.Data (OR-Mappers) -n- 表 -n- 浏览量 -n- 程序 -n- 函数

Project.Infrastructure.Components(通用) -n- 邮件 -n- 密码学 -n- 用户界面

Project.Infrastructure.Services(特殊操作) -f- DoingSomethingService1.xx -f- DoingSomethingService2.xx -f- DoingSomethingService3.xx

域实体和值类型不使用域服务。应用层使用域的服务。 Domain Repository 对象使用 Infrastructure.Data 对象返回 Domain 对象。

【讨论】:

DDD 的重点不是要有一定的项目结构,而是要对你的实体有行为。当您说“复制您的 ORM 对象”时,听起来您正在使用贫血域,这根本不是真正的 DDD。行为(域状态突变)应该在域对象内部,而不是在服务中。 当然,瑞恩。 DDD 与某个项目类型无关。这是一个实现细节。这就是为什么我说查看项目结构可能会有所帮助。通过“制作副本”,我说的是属性,而不是行为。在大多数情况下,域对象将类似于数据库对象。那是什么意思?这意味着属性将是相似的,除了 Aggregate 和 Composition 关联。由于这使您感到困惑,因此我将删除该文本。如果它让你感到困惑,我相信它会让其他人感到困惑。 我认为您的意思是属性,而不是属性。我不是要批评,只是澄清一下。我认为域对象上的属性是一种反模式。最近我一直在走向准 cqrs 路线:只读我的域上的属性和改变状态的方法。我的视图大约有 50% 来自非规范化数据库视图,50% 来自域模型。我选择的方法只是取决于数据的复杂性。 @Roy 既然您说“域实体和值类型不使用域服务”,这是否意味着它也不使用存储库? Aggregates 怎么样,它也不使用 Service 或 Repository 吗? 过去,我有实体或聚合根 (AR) 调用存储库。现在,我的 AR 由存储库保存或检索。域可能是一件非常有趣的事情。您必须对它的设计和实现感到满意。有些 AR 很简单,但有些可能具有包含数百万个项目的集合属性。从实体或 AR 调用存储库通常太诱人了,因为有时它看起来很自然。我建议尝试通过不从实体或 AR 调用存储库来了解您能走多远。您正在从事哪种类型的项目或解决方案?【参考方案3】:

关于 DDD 的不幸之处在于“服务”一词。它应该是“域服务”。将域视为实体和值对象,而服务是处理动作、操作和活动的一种方式。

至于存储库,它们只是一个外观,应该像您的域的集合一样。如果您正在使用 ORM 或编写自己的 ORM,那么您的所有域对象都应该通过这种方式来实现持久性,而不是直接使用这些服务。

【讨论】:

好吧,也许你误解了我的问题,或者我误解了答案。在基础设施层中,如果我们有一个处理邮件 API 的服务,我们将其称为“电子邮件服务”,但从数据库中检索数据的代码称为“存储库实现”。不就是同一种“基础设施服务”吗?【参考方案4】:

为什么要将存储库实现放入 Infrastructure 中?它们根本与“基础设施”无关。

根据Evan's Blue Book,存储库是域模型的一部分。因此,我将存储库接口放在域模型中。存储库的实现有时也是如此。

基础设施应包含“基础设施”代码,它可以是一项服务,使您能够通过 smtp 轻松发送电子邮件,或者为您抽象数据库访问的代码(因此,您可以在存储库中使用一些类,但它不是您的存储库)。

因此,不要将您的存储库放入“基础设施”,因为它们不属于那里。 对我来说,可以在基础设施中找到的类是可以在其他不同项目中使用的类,明白我的意思吗?与您的域模型或应用程序不紧密相关的类属于基础架构。存储库实现与特定应用程序紧密耦合。 :)

【讨论】:

我认为存储库是特定于域的,不一定是特定于应用程序的。以这种方式来看,在域模型层中定义存储库接口是有意义的。我将数据访问视为特定于域的基础架构问题,与应用程序代码分开。我明白您所说的可重用库,但我将这些库分成不同的模块:一个(或多个)可重用模块,包含诸如 EmailSender 之类的类,以及一个(或多个)特定于域的基础架构模块,包含诸如客户存储库。不同的模块,相同的层。 确实,存储库实现不应该在应用程序中。它应该在域模型中。但是,应用层应该控制存储库使用的事务范围。 我认为传统存储库应该在域模型之外实现,如果它包含进行数据访问的实际基础设施。但是根据 Jimmy Nilsson 的 NWorkspace 概念,我认为存储库可以将非基础设施实现移回更有意义的领域层。 存储库接口可以进入 CORE/DOMAIN,存储库的实现在基础设施中很好,尤其是在任何 ORM 的情况下。我们不希望 CORE 中存在 ORM 依赖项。 因此,如果您的存储库接口位于“DOMAIN”中,并且您的实现位于基础架构中,这意味着您的基础架构了解您的域(您依赖于“INFRA”中的“DOMAIN”) .我不认为你想要那个......

领域驱动设计ddd的一些基础概念(代码片段)

什么是DDDDDD的特点战略设计、战术设计DDD在微服务中解决的问题DDD的好处与局限领域领域、子域核心域、通用域、支撑域通用语言、限界上下文通用语言限界上下文实体、值对象实体值对象聚合和聚合根聚合聚合根如何设计聚合... 查看详情

领域驱动设计(ddd)架构演进和ddd的几种典型架构介绍(图文详解)

...划分与架构设计呢?一、专业术语各种服务IAAS:基础设施服务,Infrastructure-as-a-servicePAAS:平台服务࿰ 查看详情

领域驱动设计(ddd)架构演进和ddd的几种典型架构介绍(图文详解)

...划分与架构设计呢?一、专业术语各种服务IAAS:基础设施服务,Infrastructure-as-a-servicePAAS:平台服务࿰ 查看详情

DDD:在哪里放置域服务的实现

】DDD:在哪里放置域服务的实现【英文标题】:DDD:Wheretoputimplementationofdomainservices【发布时间】:2017-01-2909:00:42【问题描述】:DomainService实现应该驻留在DDD项目结构中的什么位置?如果我们有IDomainInterface和DomainInterface实现,Domai... 查看详情

ddd专栏4:ddd如何保护领域模型

...、DDD如何保护领域模型​上一讲中,我们已经提到了领域服务、实体和值对象的重要性,基于这些基础对象,就能够形成一个基础的领域模型。我们对这个领域模型进行一些贫血模型和充血模型的设计,就能搭建出一套基于领域... 查看详情

ddd实践_如何使用ddd设计代码模型

...传送地址,请点击本链接。目录一、DDD分层架构与微服务代码模型二、微服务一级目录结构三、各层目录结构四、注意事项五、领域对象的整理六、从领域模型到微服务的设计七、领域层的领域对象八、应用层的领域对象九... 查看详情

微服务如何划分(代码片段)

...势在于每个服务足够小,相互之间具备隔离性。配合一些基础设施,能够使得需求快速迭代上线。但 查看详情

浅谈ddd中的聚合(代码片段)

...VC的基础上增加领域层,使用充血模型,解耦基础服务,我的代码就符合DDD了。为什么要使用DDD?DDD分为战略部分跟战术部分,相信大家都认同DDD的核心在战略而非战术。而战略方面的核心我认为在业务建模&#x... 查看详情

在 DDD 中公开 ASP.NET 身份服务

】在DDD中公开ASP.NET身份服务【英文标题】:ExposingASP.NETIdentityServicesinDDD【发布时间】:2015-09-2009:07:48【问题描述】:我们正在开发一个使用ASP.NETMVC、C#和EF6开发的基于DDD的应用程序。已决定使用ASP.NET身份服务实现身份验证和授... 查看详情

ddd学习笔记1——分层架构

新旧架构对比图:  DDD中的基础设施层包括数据持久化(ORM数据访问),IoC容器实现,AOP实现(安全,日志记录,缓存等)Repository的接口通常放在领域层,具体实现在基础设施层旧架构的业务层被分成应用程序层和领域层 查看详情

领域驱动设计(ddd)架构演进和ddd的几种典型架构介绍(图文详解)

...划分与架构设计呢?一、专业术语各种服务IAAS:基础设施服务,Infrastructure-as-a-servicePAAS:平台服务,Platform-as-a-serviceSAAS:软件服务,Software-as-a-service二、架构演变从图中已经可以很容易看出架构的演... 查看详情

ddd领域驱动开发

文章目录DDD(DomainDrivingDesign)领域驱动开发1、微服务设计为什么选择DDD1、架构对比2、微服务的问题3、战略设计(业务层面-业务架构)4、战术设计(技术层面-系统架构):5、DDD和微服务2、领域、子... 查看详情

ddd领域驱动开发

文章目录DDD(DomainDrivingDesign)领域驱动开发1、微服务设计为什么选择DDD1、架构对比2、微服务的问题3、战略设计(业务层面-业务架构)4、战术设计(技术层面-系统架构):5、DDD和微服务2、领域、子... 查看详情

ddd领域驱动开发

文章目录DDD(DomainDrivingDesign)领域驱动开发1、微服务设计为什么选择DDD1、架构对比2、微服务的问题3、战略设计(业务层面-业务架构)4、战术设计(技术层面-系统架构):5、DDD和微服务2、领域、子... 查看详情

可落地的ddd-工程结构

...域服务、领域事件、实体、值对象这些有序的组织起来。基础设施应用依赖的外部资源,包括存储、外部接口、消息等。架构模式应用被拆成四层,每一层有自己的作用。现在我们需要做的就是有效的组织这四层,以... 查看详情

可落地的ddd-工程结构

...域服务、领域事件、实体、值对象这些有序的组织起来。基础设施应用依赖的外部资源,包括存储、外部接口、消息等。架构模式应用被拆成四层,每一层有自己的作用。现在我们需要做的就是有效的组织这四层,以... 查看详情

.netcore+ddd基础分层之领域实体

                   (1)先看项目各层次划分,下面将从最底层逐渐详细讲解 一、创建领域实体模型基类   1.首项创建基础设施层Centa.ZJ.DriveCurse.Dom 查看详情

ddd领域驱动设计-ddd概览

...,领域专家就是对业务很了解的人。限界上下文也就是微服务的边界,也可以理解为微服务,一个限界上下文=一个微服务。个人理解领域驱动设计就是微服务驱动设计,从战略上先进行微服务的划分,从战术上针对某个微服务... 查看详情