自我理解的洋葱模型

news/2024/11/20 23:22:06/文章来源:https://www.cnblogs.com/aoximin/p/17766739.html

前言

简单说自己理解的洋葱模型。

正文

先来看一个洋葱模型:

这个是ddd的洋葱模型。

我们看到最里面的是domain model。

为什么里面是domain model呢? 领域模型

domain model 是做什么的,是实现我们业务逻辑模型的,这个重中之重。

然后看domain services 是什么呢?

当涉及到多个domain model的时候,那么就需要domainservice 进行关联。

这里一个domain model 就是一个聚合根。

那么也就是domain model 和 domainservice 实现了我们的核心业务,也就是domain层。

实际上,我们的一个业务例子,就应该调用一个domain model 或者 domainservices 方法,而不是调用多个。

因为domain层就已经是核心领域逻辑业务,就是已经实现了领域业务逻辑的,组装本身也是业务逻辑,所以不应该放在上层。

然后继续往上看,为啥上面有一个application service呢?理论上domain层就已经实现了业务逻辑了。

application service 是对数据的组装与校验

application service 基本上做两件事:

  1. 单纯查询数据,当需要查询数据的时候,因为这不涉及到领域业务。

有人就会问了,为什么查询不涉及领域业务呢? 因为查询没有任何修改,本质上是对数据库的查询即可,不涉及到任务业务。

  1. 为领域层提供基本数据校验和数据查询

基本数据校验:
比如说,需要修改a用户的姓名,那么application service层,要做的事情就是查出用户a,校验用户a是否存在,如果不存在就抛出业务异常
数据查询:
比如说,领域层有一个需要修改用户email的方法:

void EditEmail(string email, string code)
{if(Code == code){Email = email;}else{throw new Exception();}
}

需要传入email和code,code 是为了校验。

那么可能application service 方法是这样的。

void EditEmail(string email)
{1. 获取到code2. 调用领域层EditEmail方法
}

这上面只是一个假设哈,可能存在需要通过一些去其他服务获取信息的情况。

有人就会疑惑了,也是一个初学者的疑惑。

比如说,业务例子是这样的,修改完email后,需要更新领域B的字段C,这个时候b领域在另外一个B服务中。

是在application service 中这样写呢?

void EditEmail(string email)
{1. 获取到code2. 调用领域层EditEmail方法3. 调用服务B的更新字段C
}

还是在domain层:

void EditEmail(string email, string code)
{if(Code == code){Email = email;// 调用服务B的更新字段C}else{throw new Exception();}
}

这里应该是在domain层实现,因为这本事就是其中的一个业务逻辑,涉及到修改,保持一致性和业务完整性。

是否放在domain层就看是否是该领域的业务逻辑。

在外圈就是具体实现了,比如具体实现的services,DB,Jobs 等。

application service 也只是数据的组装和校验而已,没有具体实现的,真正实现就在infrastruction。

差不多由这几层就组成了一个application了。

然后再外圈就是kibana等外部依赖服务了。

这里面实现的其实就是一个控制反转。

就是业务核心逻辑在最高层,而具体实现在低层去依赖最高层,而不是最高层去依赖低层。

为什么要这么做呢?因为我们做项目的目的就是为了去解决业务,业务是核心逻辑。

当需要替换底层的时候,就可以马上进行替换,而让核心逻辑不需要改变。

当核心逻辑需要改变的时候,而又不需要关心底层逻辑,因为高层不依赖低层。

然后最重要的一点就是洋葱模型就是洋葱模型,不要跟什么微服务,cqrs,eventbus挂钩,那是另外的事情。

简单的自我理解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/837588.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

B.XOR = 平均值

题目 给你一个整数 n 。找出一个由 n 个整数 a1, a2, ..., an 组成的序列,使得所有 i 和 i<= ai<=10^9 都是i<=ai<=10^9 。其中⊕表示 bitwise XOR。 可以证明存在满足上述所有条件的整数序列。 输入 第一行输入包含 t ( i <= t <= 10^4 ) - 测试用例数。 每…

攻防世界-easyupload

打开环境有一个文件上传的界面 结合题目名字,这是一道木马上传的题目 直接上传木马图片 给出回显“Your file looks wicked”,这说明了此处的文件上传存在过滤首先尝试修改一句话木马的构造<?php @eval($_POST[1]);?><?=eval($_POST[1]);?>利用直接利用短标签…

yolo --- 官方提供的预训练模型

下载路径:https://github.com/ultralytics/ultralytics官方提供了不同规格的模型,其含义分别如下:规格含义示例YOLOv8 Nano 非常小 YOLOv8nYOLOv8 Small 小 YOLOv8sYOLOv8 Medium 中 YOLOv8mYOLOv8 Large 大 YOLOv8lYOLOv8 X(Extra Large) 非常大 YOLOv8x

关于远程连接虚拟机Network error: Connection timed out的问题

今日在使用MobaXterm远程连接虚拟机的时候报错Network error: Connection timed out。令我感到诧异,昨天都能连上,今天突然不行了。经过查看发现我所使用的NAT模式的ip并没有发生改变可以看到我这里虚拟机使用的是VMnet8解决方式为:1.在控制面版中搜索“网络”,点击查看网络…

基于木舟平台浅谈surging 的热点KEY的解决方法

一、概述上篇文章介绍了基于surging的木舟平台如何构建起微服务 ,那么此篇文章将介绍基于木舟平台浅谈surging 的热点KEY的解决方法木舟 (Kayak) 是什么?木舟(Kayak)是基于.NET6.0软件环境下的surging微服务引擎进行开发的, 平台包含了微服务和物联网平台。支持异步和响应式编…

单变量微积分学习笔记:线性和二阶近似(16)【3】

线性近似 公式 \(x \to x_0\),\(f(x) \approx f(x_0) + f(x_0)(x-x_0)\)【切线】推导: \(f(x_0) = \lim_{x \to x_0}\frac{f(x)-f(x_0)}{x-x_0}\)【导数的定义】推论 前提:\(x \approx 0\), \[\sin(x) \approx x \]\[\cos(x) \approx 1 \]\[e^x \approx 1 + x \]\[ln(x+1) …

Spring之OCP开闭原则和DIP依赖倒置原则

通过如下代码,来分析几个开发原则(OCP开闭原则和DIP依赖倒置原则) 代码结构1.Test类 package com.xu.spring6.client;import com.xu.spring6.web.UserAction;public class Test {public static void main(String[] args) {UserAction userAction = new UserAction();userAct…

Blog2-题目集4~6

一、前言: 本次的大作业,包含了两个部分,一个是之前的1-3大作业(答题程序)还剩余的一次迭代,另外两个是最近做的电路设计的迭代,总而来说,这些大作业都是对于自己能力的考验,也是对自己的提升。二、设计与分析: 大作业4最后一题: 1.源码分析: 这次的迭代相比于上次…

面试题精选04-使用Linq怎么将数据分组之后按时间排序取最新1条数据

实体类 public class Movie {public string Name { get; set; }public string Area { get; set; }public DateTime ProductTime { get; set; } }初始化数据 public static List<Movie> InitData() {List<Movie> data = new List<Movie>(){new Movie(){ Name=…

WEB攻防-PHP应用文件包含LFIRFI伪协议编码算法无文件利用黑白盒

什么是文件包含 1、原理 程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时, 直接调用此文件,而无须再次编写,这种调用文件的过程一般被称为文件包含。 在包含文件的过程中,如果文件能进行控制(如进行替换和修改),则存储文件包含漏洞白盒发现: 在php…

局部变量和成员变量的区别

1,区别2.内存位置不同如图,主方法里的变量stu1和stu2在栈内存,new开辟空间后,name变量在堆内存 . 3.生命周期不同 1.随着对象的消失而消失 https://kdocs.cn/l/cuQvFYJirzaR?linkname=150996495 主方法进栈,遇到method,method进栈,有new进堆,name成员变量进入空间 随着…

53.8 MB/s,新晋开源神器榨干你的网速:Gopeed!

软件介绍 今天给大家推荐一款全平台多线程高速下载器(支持磁力BT):Gopeed !Gopeed(全称 Go Speed),中文名叫做够快下载器,是一款由 Golang + Flutter 开发的现代化高速下载器,它是一款全平台多线程高速下载器,支持Windows、Macos、Linux、Android、iOS、Web、Docker、…