如何一步一步用DDD设计一个电商网站(三)—— 初涉核心域

news/2024/5/9 12:01:11/文章来源:https://blog.csdn.net/weixin_34383618/article/details/86228070

本系列所有文章

如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念

如何一步一步用DDD设计一个电商网站(二)—— 项目架构

如何一步一步用DDD设计一个电商网站(三)—— 初涉核心域

如何一步一步用DDD设计一个电商网站(四)—— 把商品卖给用户

如何一步一步用DDD设计一个电商网站(五)—— 停下脚步,重新出发

如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文

如何一步一步用DDD设计一个电商网站(七)—— 实现售价上下文

如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成

如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车

如何一步一步用DDD设计一个电商网站(十一)—— 最后的准备

如何一步一步用DDD设计一个电商网站(十二)—— 提交并生成订单

如何一步一步用DDD设计一个电商网站(十三)—— 领域事件扩展

 

阅读目录

  • 前言
  • 定义几个基类
  • 核心域(销售子域)中有什么
  • 更好的存活于分布式背景下
  • 结语

 

 

一、前言

    结合我们本次系列的第一篇博文中提到的上下文映射图(传送门:如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念),得知我们这个电商网站的核心域就是销售子域。因为电子商务是以信息网络技术为手段,以商品交换为中心的商务活动,一个好的核心域设计可以大大提升企业的竞争力和对市场变化的相应速度。

 那么我们开始设计领域对象。对于设计领域对象的基本概念不了解的可以先阅读我的该系列第二篇文章(传送门:如何一步一步用DDD设计一个电商网站(二)—— 项目架构)。

 

二、定义几个基类

    我相信我们大部分人会以如下的方式去存放我们定义的基类,见图1。

              【图1】

    这是一种比较常规的技术分层思维方式产生的结果,在某些项目文件中或多或少有那么几个"Base"、"Core"、"Common"等的文件夹存放着一些通用的类,它们起着对当前项目中类的抽象、实现通用性支撑性功能的作用。然而在DDD中这些都应属于基础设施层的事情,这样能够保证其他层专注于自身的职责,不会把本应内聚的东西泄露到这些类中。如我们当前的领域层就专注于领域建模,里面的概念全部与通用语言相关。说干就干,搬到基础设施层去,再取个能表达出一致概念的名字的模块存放,如图2。

              【图2】

三、核心域(销售子域)中有什么

    “销售”用通俗的话讲就是“把商品卖给用户”,这几个字中就已经凸显出几个概念:“商品”,“用户”,“卖”。以下就是”商品“和”用户“的代码实现:

                【图3】

              【图4】

    我相信有许多人会以图3和图4的方式定义我们的商品和用户,乍一看的确符合对商品、用户概念的独立的理解。但在DDD中有不同的限界上下文,每个限界上下文专注处理自身的业务,多个限界上下文之间是以协作的方式工作。保证多个限界上下文之间的良好协作关系的方式是提高自治性。提高自治性的方式又有很多,技术方面如领域事件、消息队列、事件源等,这里暂时不展开描述。从代码层面来看,建模的时候只获取对当前上下文业务处理刚刚好大小的数据,也可以提高当前项目的自治性。

    根据我们划分的上下文映射图,用户和商品是属于另外的上下文的,那么在这里我们都应该建模为值对象,因为我们是无法直接修改这些对象的内部属性的。另外,在上面2个图中,获取其他上下文中的资源时,我们作为客户方基本上是不会原封不动的消费服务方提供的数据的。比如这里面的Product.PermitNo(批文号),在大部分行业里,它与销售商品没什么关系。再如User.BlockedBalance(冻结余额),在销售的过程中,只需要知道用户有多少可用余额就好了。这个思路总结一下就是,从业务角度我们不求大而全,只求刚好满足当前业务即可,但是当业务发生变化的时候我们的领域模型也要及时反映出调整后的通用语言概念。得到修改后的模型:

                  【图5】

                  【图6】

    对了,不管是值对象还是实体和聚合,习惯在构造函数中的做好守卫验证,有利于表达出什么样的领域对象是合法的。

 

四、更好的存活于分布式背景下

 在某些背景下一个限界上下文是作为独立的服务对外提供API进行访问的,特别在电商行业,分布式系统的构建是个普遍情况,方式也多元化,各种RPC框架、Restful等技术选型,SOA、微服务等实现理念层出不穷。如何最大化的降低技术变更和业务变化导致的上下文划分调整的影响,也是我们要考虑的重要问题。

 对于我们.Net开发人员来说,在分布式场景下用的最多的方式无非是WebAPI和WCF了。这种方式也就是在第一篇文章中所提到的发布语言和开放主机服务,那么对于客户端来说需要做好防腐层(第一篇文章中有提到)的工作,好避免外部上下文的概念侵入到自身的领域概念中。一个普遍的防腐层实现时序图,其中真正负责防腐层工作的是XXXAdapter和XXXTranslator,如下(摘自[Vaughn Vernon]《实现领域驱动设计》):

                        【图7】

我们这里实现的相关类如下图所示定义:

                  【图8】

  其中1存放着访问远程资源的接口定义,2是其实现方式。这样设计的好处是,对于领域层的建模隐藏了数据获取的实现细节。并且当我们实际开发的时候可能由于需要配合服务方还未准备好,但是这丝毫不影响我们的开发工作,我们可以定义个Mock类来实现这里的IRemoteServices中的接口,就可以顺利地进行开发工作。

  其中ProductAdapter、UserAdapter分别负责请求商品上下文和用户上下文并取得原始结果,ProductTranslator、UserTranslator则是通过解析原始结果,转换为我方上下文中需要的领域模型概念。以下则是核心部分的实现:

                  【图9】

                   【图10】

 

五、结语

 本来打算想把整个“把商品卖给用户”过程讲完,但是发现这样篇幅太长,所以这次就先到这里,先把其中的2个主体整个设计过程给弄明白了,接下去再讲“卖”这个行为该如何设计。谢谢各位看官:)
 本文的源码地址:https://github.com/ZacharyFan/DDDDemo,注意其中的Restful请求地址和Json解析类为假实现,仅为了用于支持本文的表述。

 

    

 

作者:Zachary_Fan
出处:http://www.cnblogs.com/Zachary-Fan/p/6036729.html

 

 

 

▶关于作者:张帆(Zachary,个人微信号:Zachary-ZF)。坚持用心打磨每一篇高质量原创。欢迎扫描右侧的二维码~。

定期发表原创内容:架构设计丨分布式系统丨产品丨运营丨一些思考。

 

如果你是初级程序员,想提升但不知道如何下手。又或者做程序员多年,陷入了一些瓶颈想拓宽一下视野。欢迎关注我的公众号「跨界架构师」,回复「技术」,送你一份我长期收集和整理的思维导图。

如果你是运营,面对不断变化的市场束手无策。又或者想了解主流的运营策略,以丰富自己的“仓库”。欢迎关注我的公众号「跨界架构师」,回复「运营」,送你一份我长期收集和整理的思维导图。

 

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

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

相关文章

linux如何运行windows游戏,cedega - Ubuntu下也玩Windows游戏,三种途径开启魔兽[图文]_Linux教程_Linux公社-Linux系统门户网站...

3. cedega:Cedega6.0的安装和配置 (deb安装,最新版本为6.1)安装过程:下载后解压cedega.6.0.tar.bz2,得到两个文件 :cedega-small_6.0_all.debcedega-engine-6.0-local-update.i386.cpkg安装 cedega-small_6.0_all.deb 这个包,cede…

windows10服务器维护,win10自动开机设置方法_网站服务器运行维护,win10

centos系统重启网络失败怎么办_网站服务器运行维护centos系统重启网络失败的解决方法是:1、首先,执行命令【ip addr】查找HWADDR;2、然后,进入network-scripts目录,编辑ifcfg-ensXX文件;3、最后&#xff0c…

zz国外接活网站Elance, Freelancer和ScriptLance的介绍和对比

https://www.douban.com/note/207068251/zz国外接活网站Elance, Freelancer和ScriptLance的介绍和对比伊莎贝拉 2012-03-27 19:30:05 国外接活网站Elance, Freelancer和ScriptLance的介绍和对比在网上接活的朋友,都知道Elance, Freelancer 和ScriptLance是…

网站前端_JavaScript-基础入门.0004.JavaScript数据类型

2019独角兽企业重金招聘Python工程师标准>>> 简单说明: 1. JavaScript中有6种数据类型,Undefined/Null/Boolean/Number/String/Object,需要注意的是不支持创建自定义类型的机制.所有值必须如上6中类型之一 2.typeof操作符可以操作变量,也可以操作字面量,虽然也可以t…

大型网站系统与Java中间件实践

2019独角兽企业重金招聘Python工程师标准>>> 分布式系统简介 分布式系统有很多节点,且这些节点协同工作。 线程与进程的执行模式 1、线程的执行模式:互不通信的多线程模式;基于共享容器协同的多线程模式,如经典的生产者…

从零开始用 Flask 搭建一个网站(二)

2019独角兽企业重金招聘Python工程师标准>>> 从零开始用 Flask 搭建一个网站(一) 介绍了如何搭建 Python 环境,以及 Flask 应用基本项目结构。我们要搭建的网站是管理第三方集成的控制台,类似于 Slack。 本篇主要讲解数…

android中文网站

Google Developers中国网站发布 用户评价: / 55 差好 最后更新于 2016年12月09日 点击数:15209 我们很高兴地宣布,Google Developers 中国网站 (developers.google.cn) 正式发布! Google Developers 中国网站是特别为中国开发者…

python获取网站http://www.weather.com.cn 城市 8-15天天气

参考一个前辈的代码,修改了一个案例开始学习beautifulsoup做爬虫获取天气信息,前辈获取的是7日内天气, 我看旁边还有8-15日就模仿修改了下。其实其他都没有变化,只变换了获取标签的部分。但是我碰到 一个span获取的问题&#xff0…

网站静态化处理—前后端分离—上(6)

前文讲到了CSI技术,这就说明网站静态化技术的讲述已经推进到了浏览器端了即真正到了web前端的范畴了,而时下web前端技术的前沿之一就是前后端分离技术了,那么在这里网站静态化技术和前后端分离技术产生了交集,所以今天我将讨论下前…

交友网站数据库曝光了150万用户信息

据外媒报道, 近日一个新西兰交友网站对一个包含150多万用户信息的数据库进行了安全性保护。这家网站的运营商C&Z Tech Limited表示, MacKeeper安全研究中心的安全专家在发现这个问题后向该公司发出提醒。 C&Z 在发给MacKeeper的邮件中表示&#…

基于SSM的校园招聘网站

​源码编号:D-E22 项目类型:也属于Java web项目/Java EE项目(非开源) 项目名称:基于SSM的校园招聘网站 [Recruit] 当前版本:V1.0.1版本 难度等级:✩✩ 复杂程度:✩✩✩ 点击查看…

基于Java web的旅游网站(源码+文档)

源码编号:B-E57点击查看(分类规则) 项目类型:Java web项目/Java EE项目(非开源) 项目名称:基于java web的旅游网站 [travel] 当前版本:V1.0.0版本 用户类型:双角色&…

基于JSP的旅游网站系统

源码编号:B-E74点击查看(分类规则) 项目类型:Java web项目/Java EE项目(非开源) 项目名称:基于JSPServlet的旅游景点服务平台(旅游网站) 源码作者:霹雳、逍…

基于JSP+Servlet的宠物养护网站

源码编号:B-E77 项目名称:基于JSPServlet的宠物养护网站 源码作者:逍遥游制作 论文作者:逍遥游撰写 当前版本:V1.0版本 用户类型:三角色(用户、管理员) 项目架构:B…

有图有真相 好图好流量 十个妙招优化网站图片

【51CTO.com快译】对于任何一个电子商务网站来说,图片优化都是必不可少的环节。图片对于消费者和网友的影响妙不可言,优化图片是一门网店里的艺术。图片的清晰度、吸引力和加载时间都将直接影响到你的用户。下面我们就为大家介绍一些优化图片的小技巧&am…

自学Java网站推荐

自学Java可以学会吗? 很多同学问我自学Java能学会吗,我可以很负责任的告诉你完全可以!因为俺当初就是自学Java找到的工作,目前互联网资源丰富,只要你想学肯定能学会!!! 自学Java最…

大型网站技术基石之 OpenStack

我们知道虚拟化能够充分的利用资源,带来各种各样的好处。 当一个网站不大,只需要四五台机器就可以支撑的时候,可以采用手工的方式虚拟机,但是当网站流量很高,需要成千上万台机器的时候,那就非常不方便了。 …

云服务器 ECS 搭建WordPress网站:安装 WordPress

安装 WordPress请先下载最新版的 WordPress,网址: https://cn.wordpress.org/ 。也可直接到阿里云市场选择WordPress镜像完成一键部署,点击查看。 操作步骤 1.将下载的安装包解压缩。 2.打开 Xshell,然后打开 Xftp,将解…

云服务器 ECS 建站教程:部署 LAMP (CentOS 7.2)

部署 LAMP (CentOS 7.2)简介 LAMP指LinuxApacheMysql/MariaDBPerl/PHP/Python是一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度,共…

​详解SEO优化中所使用的新浪博客站群

SEO优化的过程中网站的权重是关键词排名不可或缺的因素,为了提升网站的权重SEOer通常会利用第三方平台的高权重为SEO所用,今天给大家讲一个关于新浪博客站群的概念以及具体的操作方法。顾名思义新浪博客站群分解开来通俗点来说就是新浪博客的集群&#x…