首页 > 其他分享 >自我理解的洋葱模型

自我理解的洋葱模型

时间:2024-11-20 23:20:08浏览次数:1  
标签:domain code 模型 自我 业务 application 洋葱 逻辑 email

前言

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

正文

先来看一个洋葱模型:

这个是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. 获取到code
    2. 调用领域层EditEmail方法
}

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

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

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

是在application service 中这样写呢?

void EditEmail(string email)
{
    1. 获取到code
    2. 调用领域层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挂钩,那是另外的事情。

简单的自我理解

标签:domain,code,模型,自我,业务,application,洋葱,逻辑,email
From: https://www.cnblogs.com/aoximin/p/17766739.html

相关文章

  • yolo --- 官方提供的预训练模型
     下载路径:https://github.com/ultralytics/ultralytics官方提供了不同规格的模型,其含义分别如下:规格含义示例YOLOv8Nano非常小YOLOv8nYOLOv8Small小YOLOv8sYOLOv8Medium中YOLOv8mYOLOv8Large大YOLOv8lYOLOv8X(ExtraLarge)非常大YOLOv8x......
  • FastLLM高性能大模型推理库
    FastLLM是一个高效、易用的轻量级语言模型库。......
  • 大语言模型及其应用,学习大语言模型,收藏这一篇就够了!
    机器学习机器学习(MachineLearning,ML)是指从数据中自动学习规律和模式,并利用这些规律和模式,在新的数据中完成类似任务的技术和方法。它属于人工智能(ArtificialIntelligence)的一个分支。前排提示,文末有大模型AGI-CSDN独家资料包哦!机器学习的核心思想是使用数据来训练计算......
  • 信任的大型语言模型:通过知识库和双解码器定制和基于事实的文本生成
    在人工智能的世界中,大型语言模型(LLMs)的表现如同一位天才演员,尽管它们在内容生成方面技艺非凡,却常常因生成内容的领域限制而“演过了头”。就像《哈利·波特》中的榴莲糖,味道总是让人意外。为了让这些模型“脚踏实地”,我们需要确保其生成的内容基于一个经过验证的背景。这就......
  • 大模型之争深水期,企业如何真正实现产业级落地?
    大模型之争,已经进入了深层阶段。前排提示,文末有大模型AGI-CSDN独家资料包哦!随着"百模大战"逐渐平息,整个模型市场步入了一个更为冷静的时期。但表面的宁静下,实则暗流涌动,竞争已经从单一的模型能力转向了更为复杂的生态系统建设。真正的较量在于谁能将模型的力量转化为实际......
  • 内存模型
    前言不是特别懂,但是先把自己目前的理解写下来(甚至目前的有些理解都是错的),随着时间的积累再丰富;内存模型有三种内存模型:FlatMemory:所有内存都是连续的,通过数组管理所有的page,数组的下标就是pfn;所有可以很简单的pfn下标找到对应的page,page可以很简单的找到pfn;DiscontiguousM......
  • 实时多模态 AI 的 N 种新可能丨实时互动和大模型专场@RTE2024回顾
      在本届RTE2024大会上,来自产业界和学术界的多位专家深入探讨了实时互动和大模型技术的最新进展及其潜在应用。 西湖心辰联合创始人俞佳、声网AI算法工程师乔齐、MiniMax资深音频算法专家张博闻、商汤科技数字文娱解决方案负责人焦文奎以及面壁智能算法VP翟忠武等......
  • 卫生间3D模型哪里有?厕所/洗手间/浴室等3d模型哪有?
    ​在现代家居设计中,卫生间的美观与功能性同样重要。寻找合适的卫生间3D模型,可以为设计师提供灵感和参考。无论是厕所、洗手间还是浴室,3D模型都能帮助我们预览最终效果,确保设计既实用又美观。那么,哪里可以找到这些高质量的3D模型呢?让我们一探究竟。Bimobject拥有来自250个卫生......
  • 开源模型应用落地-LangChain实用小技巧-检索器-集成多种检索器(十八)
    一、前言   在LangChain中,检索器是一个重要模块,主要用于从数据源中检索与查询相关的文档或片段。它能高效进行信息检索,通过快速筛选和语义理解从大规模文本数据中找到相关内容,支持复杂应用场景如检索增强生成和多源数据整合,还具有可定制性和灵活性,可选择不同嵌入模型和索......
  • 【论文阅读笔记】多模态大语言模型必读 —— LLaVA
    论文地址:https://arxiv.org/abs/2304.08485代码地址:https://github.com/haotian-liu/LLaVA目录简介VisualInstruction数据生成视觉指令微调模型架构训练简介人类对于世界的认知是通过视觉、语言多个途径的,因此设计出能够遵循多模态的视觉和语言指令的通用大模型成为了人......