LOFTER for ipad —— 让兴趣,更有趣

点击下载 关闭
领域驱动设计常用组件类型都有哪些
晋皖达内 2023-05-29

  组件化编程开发随着互联网的不断发展而被越来越多的程序员掌握,今天我们就通过案例分析来简单了解一下,领域驱动设计常用组件类型都有哪些。

  ExternalAPI

  应用服务的逻辑不仅仅需要协调领域层,有时还需要依赖于外部的三方服务。ExternalAPI组件负责对这些外部服务进行接口声明定义,不做具体实现。

  应用服务组件不直接依赖这些外部服务实现,而是依赖其接口抽象。同时,此处的模型定义是基于该限界上下文的语义,是一种对外部模型的适配。

  该组件不依赖其它组件,且仅被应用服务组件和Gateway组件依赖。网关组件依赖ExternalAPI组件的接口声明并提供底层技术实现,应用服务组件依赖其接口,并通过IOC方式将具体实现注入完成服务调用。

  注意,该组件所依赖的服务不涉及领域逻辑,只是用于支撑应用服务的编排。如果是涉及了领域逻辑,则对外部服务依赖的接口定义需要下沉到Domain层。

  Query

  Query组件解决领域相关的报表查询场景,在限界上下文内作为与应用服务对等的组件存在,两个组件分别负责业务的查询和命令逻辑。

  虽然引入了Query组件对报表场景提供支持,但没有完全的引入CQRS这一模式。在很多资料中CQRS与DDD同时提及的概率比较高,因为,在DDD下我们解决了复杂的面向领域的写侧模型,但在报表场景下,这种富领域模型有可能并不是佳选择。如果读侧和写侧都基于统一的领域模型,一般会导致领域模型的折衷设计。为了满足查询侧诉求,领域模型不得不引入额外的、领域无关的属性,由此造成领域模型的污染。

  Domain

  Domain组件是领域逻辑核心,承担整个系统领域逻辑的实现,其定义了领域模型、领域服务、领域事件以及仓储层的抽象。该组件不依赖其它组件(除了通用的领域模型抽象组件Common之外。

  参考架构使用了DDD的战术设计的建模元素,比如聚合、实体、值对象、仓储、工厂以及领域事件等。在实际落地过程中,这些设计元素的抽象具有一定的挑战,设计过程中需要经过不断分析、权衡和重构以完成建模,这正是核心设计所在。

  Gateway

  网关层承担整个技术相关性的实现,是内部应用的出口网关。

  技术相关性是网关组件区别于其它组件的根本特性。在该组件内要处理技术实现的所有细节,比如与外部服务、中间件、DB的交互等。同时,其与Domain组件以及ExternalAPI组件的接口抽象协作,共同承担了系统与外部依赖间(包括外部服务以及应用依赖的中间件、DB等基础设施)的防腐层职能,负责内部模型到外部模型转化、外部模型到内部模型转化以及具体交互。基于网关组件的特性,也非常适合在该层做统一的外部服务数据缓存及降级熔断处理。

  网关层依赖于Domain、ApplicationService、ExternalAPI和Query组件,负责上述四个组件定义的接口实现。在Gateway组件通过子包对实现进行隔离:

  query:查询服务组件的实现

  external:ExternalAPI组件中依赖外部服务的接口实现

  repository:仓储接口的实现


推荐文章
评论(0)
分享到
转载我的主页