(一)初识DDD(领域驱动设计)
初识DDD(领域驱动设计)
- 前言
- 01 基础概念
- 什么是DDD
- 02 DP(Domain Primitive)
- 案例一(用户登录)
- DP的引出
- 03 计划
前言
今天开始,更新领域驱动设计系统架构落地,由于白天要上班, 更新会有点慢。
01 基础概念
什么是DDD
从pop(面向过程),oop(面向对象),到最后的ddd(领域),改变的都是我们的编程思维,好的架构,不仅减轻了我们程序员的工作量,也提升了代码的可读性,减轻了维护的工作量,
02 DP(Domain Primitive)
初看DP,很难理解它是什么,
我个人认为它是一个基础的值对象,就像Integer、String类型一样,(个人理解,大神勿喷)
DP是模型,方法,架构的技术,在代码中无处不在
案例一(用户登录)
public User Login(string userName,string passWord){if (userName == null|| userName =="") {throw new Exception("账号不能为空");}if (passWord == null || passWord == ""){throw new Exception("密码不能为空");}if (userName.Length < 6){throw new Exception("账号过短");}passWord = DESHelper.Encrypt(passWord);//密码加密/** 等等校验逻辑*/return userRepository.GetUser(userName, passWord);}
这样是不是我们日常写的代码,登录一个方法里面,实际业务逻辑和校验逻辑混合在一起,很难看出实际业务逻辑是什么
数据验证代码不能复用,在登录的时候需要写一遍,在添加的时候是不是也要写一遍,在修改的时候是不是也要写一遍,如果说可以把这些代码封装一下,你觉得怎么封装好
DP的引出
这个时候,如果对象的字段可能会有自己的校验或者业务逻辑,我们初始反应可能就是写个帮助类,或者静态类,但是今天引入新的思想,使用值对象,
public class User : AggregateRoot{public string Name { get; set; }//用户名public UserName UserName { get; set; }//账号public ProjectId ProjectId { get; set; }//项目idpublic Image Img { get; set; }//图片public PassWord PassWord { get; set; }//密码public string Company { get; set; }//公司}
上面是用户对象,里面用户账号有自己的业务逻辑,
密码也有自己的逻辑,将密码创建对象如下,
public class PassWord{public string Pwd { get; set; }public PassWord(){}public PassWord(string pwd){if (pwd == null){throw new ValidationException("密码不能为空");}//else if (pwd.Length < 6)//{// throw new ValidationException("密码长度应大于六");//}else{Pwd = DESHelper.Encrypt(pwd);}}}
重写构造函数,里面写校验逻辑及密码加密
public User Login(string userName, PassWord passWord){try{CjsiteUser user = context.Set<CjsiteUser>().Where(u => u.UserName == userName && u.PassWord == passWord.Pwd).Include(q => q.Project).Include(q => q.UserRoles).FirstOrDefault();if (user == null){throw new Exception("用户名或密码错误");}return autoMapperRepository.MapTo<CjsiteUser, User>(user);}catch (Exception ex){throw new Exception(ex.Message);}}
在接口处传密码对象,实际业务代码不会带有任何校验逻辑,一个简单的封装对象,会对代码的整洁度有很大的提升,
03 计划
下篇写领域层实体对象的创建
(一)初识DDD(领域驱动设计)相关推荐
- DDD领域驱动设计之聚合、实体、值对象
关于具体需求,请看前面的博文:DDD领域驱动设计实践篇之如何提取模型,下面是具体的实体.聚合.值对象的代码,不想多说什么是实体.聚合等概念,相信理论的东西大家已经知晓了.本人对DDD表示好奇,没有在真 ...
- DDD领域驱动设计 — 贫血模型与充血模型
文章转载来源:https://juejin.cn/post/6917125801460629518 | 前言 要想深入掌握和了解 DDD 领域驱动设计的核心,那无论如何也绕不开两大较为抽象的概念-- ...
- DDD 领域驱动设计:贫血模型、充血模型的深入解读!
作者:JavaEdge在掘金 链接:https://juejin.cn/post/6917125801460629518 - 前言 - 要想深入掌握和了解 DDD 领域驱动设计的核心, ...
- 浅谈我对DDD领域驱动设计的理解
从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能够在线上也能销售自己的产品 ...
- C#进阶系列——DDD领域驱动设计初探(五):AutoMapper使用
前言:前篇搭建了下WCF的代码,就提到了DTO的概念,对于为什么要有这么一个DTO的对象,上章可能对于这点不太详尽,在此不厌其烦再来提提它的作用: 从安全上面考虑,领域Model都带有领域业务,让Cl ...
- DDD 领域驱动设计:贫血模型、充血模型的深入解读
点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 - 前言 ...
- [转]浅析DDD(领域驱动设计)
最近在做一些微服务相关的设计,内容包括服务的划分,Restful API的设计等.其中比较棘手的就是Service的职责划分:如何抽象具有统一业务范畴的Model,使其模块化,又如何高度提炼并组合多模 ...
- 浅析DDD(领域驱动设计)
最近在做一些微服务相关的设计,内容包括服务的划分,Restful API的设计等.其中比较棘手的就是Service的职责划分:如何抽象具有统一业务范畴的Model,使其模块化,又如何高度提炼并组合多模 ...
- DDD 领域驱动设计落地实践:六步拆解 DDD
引言 相信通过前面几篇文章的介绍,大家对于 DDD 的相关理论以及实践的套路有了一定的理解,但是理解 DDD 理论和实践手段是一回事,能不能把这些理论知识实际应用到我们实际工作中又是另外一回事,因此本 ...
最新文章
- vue data数据修改_史上最强vue总结,万字长文
- [PHP] 现代化PHP之路:composer的安装和升级
- c语言数组方式实现静态循环队列
- Unity 2017 Game Optimization 读书笔记(4)Scripting Strategies Part 4
- git提交代码时报错:nothing added to commit but untracked files present
- 解决:VScode 汉化后 、设置中文后 还显示英文的问题
- 微軟专为Visual Studio 2019设计出一套容器工具擴充套件
- 海量数据(数据量比较大时)的处理分析
- 目标检测——SSD的学习笔记
- 计算基因组学工具解析肿瘤与免疫细胞的互作--转载
- React Native填坑之旅--动画
- 在校大学生如何规划自己的程序员之路
- 微信小程序 地图实现查找标记地点
- 进阶无人驾驶—百度Apollo高精度地图
- 《21个项目玩转深度学习》第四章问题总结--Python3.6与2.7的兼容问题及其他小问题
- 蓝韵DR采集工作站LINUX系统,蓝韵PACS系统的技术参数
- java的jdk安装教程附百度网盘链接环境配置遇到的各种问题版本选择
- JAVA实现PDF无损转WORD
- html怎么修改表格行列间距,html表格如何设置间距
- 用1元5角钱人名币兑换5分、2分和1分的硬币(每一种都要有)共一百枚,问共有几种兑换方案?并输出每种方案。