[.NET领域驱动设计实战系列]专题二:结合领域驱动设计的面向服务架构来搭建网上书店

丰富的线上&线下活动,深入探索云世界

做任务,得社区积分和周边

最真实的开发者用云体验

让每位学生受益于普惠算力

让创作激发创新

资深技术专家手把手带教

遇见技术追梦人

技术交流,直击现场

海量开发者使用工具、手册,免费下载

极速、全面、稳定、安全的开源镜像

开发手册、白皮书、案例集等实战精华

为开发者定制的Chrome浏览器插件

从概念上说,领域驱动设计架构主要分为四层,分别为:基础设施层、领域层、应用层和表现层。

实体可以认为对应于数据库的表,而值对象一般定义在实体类中。

下面用一个图来形象展示DDD的分层架构:

本系列介绍的领域驱动设计实战,则自然少了领域驱动设计分层架构的实现了,上面简单介绍了领域驱动的分层架构,接下来将详细介绍在网上书店中各层是如何去实现的。

在应用领域驱动设计的思想来构建一个项目,则第一步就是了解需求,明白项目的业务逻辑,了解清楚业务逻辑后,则把业务逻辑抽象成领域对象,领域对象所放在的位置也就是领域模型层了。该专题介绍的网上书店主要完成了商品所涉及的页面,包括商品首页,单个商品的详细信息等。所以这里涉及的领域实体包括2个,一个是商品类,另外一个就是类别类,因为在商品首页中,需要显示所有商品的类别。在给出领域对象的实现之前,这里需要介绍领域层中所涉及的几个概念。

根据面向接口编程原则,我们在领域模型中应该定义一个实体接口和聚合根接口,而因为聚合根也是属于实体,所以聚合根接口继承于实体接口,而商品类和类别类都是聚合根,所以它们都实现聚合根接口。如果像订单项只是实体不是聚合根的类则实现实体接口。有了上面的分析,则领域模型层的实现也就自然出来了,下面是领域对象的具体实现:

//领域实体接口publicinterfaceIEntity{//当前领域实体的全局唯一标识GuidId{get;}}//聚合根接口,继承于该接口的对象是外部唯一操作的对象publicinterfaceIAggregateRoot:IEntity{}//商品类publicclassProduct:AggregateRoot{publicstringName{get;set;}publicstringDescription{get;set;}publicdecimalUnitPrice{get;set;}publicstringImageUrl{get;set;}publicboolIsNew{get;set;}publicoverridestringToString(){returnName;}}//类别类publicclassCategory:AggregateRoot{publicstringName{get;set;}publicstringDescription{get;set;}publicoverridestringToString(){returnthis.Name;}}另外,领域层除了实现领域对象外,还需要定义仓储接口,而仓储层则是对仓储接口的实现。仓储可以理解为在内存中维护一系列聚合根的集合,而聚合根不可能一直存在于内存中,当它不活动时会被持久化到数据中。而仓储层完成的任务是持久化聚合根对象到数据或从数据库中查询存储的对象来重新创建领域对象。

仓储层有几个需要明确的概念:

//仓储接口publicinterfaceIRepositorywhereTAggregateRoot:class,IAggregateRoot{voidAdd(TAggregateRootaggregateRoot);IEnumerableGetAll();//根据聚合根的ID值,从仓储中读取聚合根TAggregateRootGetByKey(Guidkey);}publicinterfaceIProductRepository:IRepository{IEnumerableGetNewProducts(intcount=0);}publicinterfaceIProductRepository:IRepository{IEnumerableGetNewProducts(intcount=0);}//仓储上下文接口publicinterfaceIRepositoryContext{}这样我们就完成了领域层的搭建了,接下面,我们就需要对领域层中定义的仓储接口进行实现了。我这里将仓储接口的实现单独弄出了一个层,当然你也可以放在基础设施层中的Repositories文件夹中。不过我看很多人都直接拎出来的。我这里也是直接作为一个层。

定义完仓储接口之后,接下来就是在仓储层实现这些接口,完成领域对象的序列化。首先是产品仓储的实现:

publicsealedclassOnlineStoreDbContext:DbContext{#regionCtorpublicOnlineStoreDbContext():base("OnlineStore"){this.Configuration.AutoDetectChangesEnabled=true;this.Configuration.LazyLoadingEnabled=true;}#endregion#regionPublicPropertiespublicDbSetProducts{get{returnthis.Set();}}publicDbSetCategories{get{returnthis.Set();}}//后面会继续添加属性,针对每个聚合根都会定义一个DbSet的属性//...#endregion}接下来就是IEntityFrameworkRepositoryContext接口的定义以及它的实现了。具体代码如下所示:

publicinterfaceIEntityFrameworkRepositoryContext:IRepositoryContext{#regionPropertiesOnlineStoreDbContextDbContex{get;}#endregion}publicclassEntityFrameworkRepositoryContext:IEntityFrameworkRepositoryContext{//引用我们定义的OnlineStoreDbContext类对象publicOnlineStoreDbContextDbContex{get{returnnewOnlineStoreDbContext();}}}这样,我们的仓储层也就完成了。接下来就是应用层的实现。

应用层应用了面向服务结构进行实现,采用了微软面向服务的实现WCF来完成的。网上书店的整个架构完全遵循着领域驱动设计的分层架构,用户通过UI层(这里实现的是Web页面)来进行操作,然后UI层调用应用层来把服务进行分发,通过调用基础设施层中仓储实现来对领域对象进行持久化和重建。这里应用层主要采用WCF来实现的,其中引用了仓储接口。针对服务而言,首先就需要定义服务契约了,这里我把服务契约的定义单独放在了一个服务契约层,当然你也可以在应用层中创建一个服务契约文件夹。首先就去看看服务契约的定义:

//商品服务契约的定义[ServiceContract(Namespace="")]publicinterfaceIProductService{#regionMethods//获得所有商品的契约方法[OperationContract]IEnumerableGetProducts();//获得新上市的商品的契约方法[OperationContract]IEnumerableGetNewProducts(intcount);//获得所有类别的契约方法[OperationContract]IEnumerableGetCategories();//根据商品Id来获得商品的契约方法[OperationContract]ProductGetProductById(Guidid);#endregion}ViewCode接下来就是服务契约的实现,服务契约的实现我放在应用层中,具体的实现代码如下所示:

//商品服务的实现publicclassProductServiceImp:IProductService{#regionPrivateFieldsprivatereadonlyIProductRepository_productRepository;privatereadonlyICategoryRepository_categoryRepository;#endregion#regionCtorpublicProductServiceImp(IProductRepositoryproductRepository,ICategoryRepositorycategoryRepository){_categoryRepository=categoryRepository;_productRepository=productRepository;}#endregion#regionIProductServiceMemberspublicIEnumerableGetProducts(){return_productRepository.GetAll();}publicIEnumerableGetNewProducts(intcount){return_productRepository.GetNewProducts(count);}publicIEnumerableGetCategories(){return_categoryRepository.GetAll();}publicProductGetProductById(Guidid){varproduct=_productRepository.GetByKey(id);returnproduct;}#endregion}ViewCode最后就是创建WCF服务来调用服务契约实现了。创建一个后缀为.svc的WCF服务文件,WCF服务的具体实现如下所示:

另外,在这里使用了Unity依赖注入容器来对接口进行注入。主要的配置文件如下所示:

最后附上整个解决方案的结构图:

实现完之后,大家是不是都已经迫不及待地想看到网上书店的运行效果呢?下面就为大家来揭晓,目前网上书店主要包括2个页面,一个是商品首页的展示和商品详细信息的展示。首先看下商品首页的样子吧:

图书的详细信息页面:

到这里,本专题的内容就介绍完了,本专题主要介绍面向领域驱动设计的分层架构和面向服务架构。然后结合它们在网上书店中进行实战演练。在后面的专题中我会在该项目中一直进行完善,从而形成一个完整了DDD案例。在接下来的专题会对仓储的实现应用规约模式,在应用之前,我会先写一个专题来介绍规约模式来作为一个准备工作。

THE END
1.基于SSM网上书店系统的设计与实现.docx基于SSM网上书店系统的设计与实现 摘要 随着时代的进步,互联网的发展越来越快,电子商务随之诞生,并且借助其方便高效的交易方式、低成本的运营、丰富的信息资源等优势,迅速占领市场,风靡全球。 上世纪90年代,我国第一笔网上电子交易成功,标志着中国开始进入电商时代,而1999年当当网的上线运营,注定了网上书店必将成为中国...https://max.book118.com/html/2024/0625/8065130120006103.shtm
2.基于javaweb的网上书店系统基于javaweb的网上书店系统 评分: 基于ssh的网上书店系统的设计与实现 系统完善 仅供参考 毕业设计 网上书店 javaweb java 2018-09-12 上传 大小:27.00MB 所需: 38积分/C币 立即下载 基于Java web的网上书店管理系统(源码+数据库).zip 一、系统移植步骤 1、在MyEclipse中导入工程,可以通过Eclipse中的菜单...https://www.iteye.com/resource/qq_35112787-10660953
3.毕业论文网上购书系统设计和实现.doc(最新资源)帮帮文库会员刚刚分享的标题为【【毕业论文】网上购书系统设计和实现】的精品文档已上架,欢迎广大用户下载学习,更多精品资源请进站下载。http://www.woc88.com/list-2363438.html
4.原创网上书店销售管理系统课程设计报告网上书店是以网站作为交易平台,将图书的基本信息通过网站发布到 Web 上,然后用户可以通过该网站浏览商品的信息,并决定买与不买,以实现书籍的在线订购业务及购买。 本系统面向的是广大的互联网用户,以实现真正的图书销售与互联网结合。但为了简单起见,目前只支持普通用户,注册用户,管理员这三类用户。普通用户只能在网站...https://www.jianshu.com/p/e6167aff52ef
1.基于JSP的网上书店系统的设计与实现正是由于网上书店具有这些传统书店无法相比的优势,网上书店才能在短时间内得以迅速发展。 本文首先论述了电子商务的发展现状,介绍了电子商务的分类,进一步分析了电子商务存在的意义,同时分析了目前我国网上书店系统存在的主要问题,并对开发网上书店的现实意义进行了阐述。其次,对B/S体系结构进行了论述,并说明了B/S的...https://wap.cnki.net/touch/web/Dissertation/Article/2011014761.nh.html
2.基于Java技术的网上书店系统的设计与实现【摘要】:介绍了运用Java技术来设计与实现网上书店电子商务系统,给出了系统的结构、功能以及解决方案的设计,并就其中的关键技术MVC结构设计进行分析,给出了解决方案。 下载App查看全文 下载全文更多同类文献个人查重>>个人AIGC检测>>文献综述>> (如何获取全文?欢迎:购买知网充值卡、在线充值、在线咨询) ...https://www.cnki.com.cn/Article/CJFDTotal-JSYJ200312052.htm
3.基于JSP的网上书店系统的设计与实现毕业作品.doc基于JSP网上书店系统设计与实现.doc系统的设计目的是为了满足消费者只要通过互联网就可以足不出户的购买自己喜欢的图书,改变传统商业交易,在互联网上进行交易,实现网上购买图书。为了实现上述目的,我对网上书店... 基于JSP网上书店系统的设计与实现.doc 浏览:62 ...https://download.csdn.net/download/qq_43966957/87843324
4.软件工程课程设计选题怎么选(5篇)5.进行系统需求分析与系统功能模块设计,绘出系统详细的业务流程图和数据流程图,建立完整的系统数据库的逻辑模型。 6.完成对系统的建模实现。7.进行检查,并提交设计报告。三.报告要求: 1.实验题目 2.实验目的 3.实验要求 4.实验内容 5.系统设计的源程序和文档(包括说明)6.心得体会 四.参考资料: boggs & micha...https://fanwen.chazidian.com/fanwen884425/
5.Java实战之网上书店管理系统的实现java本文将利用Java语言实现网上书店管理系统。其功能一般包括:图书信息管理、用户信息管理、图书购买、图书订单查看、图书添加、图书维护等等,感兴趣的可以了解一下+ 目录 1.效果展示 2.需求功能 用户可以进行注册登陆系统,在用户的界面上,其可以进行查看网上书店里的图书类别和所在类别下的图书,根据自己的需求可在订单项目...https://www.jb51.net/article/250714.htm
6.网上书店开题报告(通用9篇)题目: 网上书店管理系统的.设计与实现 学生姓名: 学号: 专业: 指导教师: xxx老师 20xx年xx月xx日 开题报告填写要求 1.开题报告作为毕业设计(论文)答辩委员会对学生答辩资格审查的依据材料之一。此报告应在指导教师指导下,由学生在毕业设计(论文)工作前期完成,经指导教师签署意见后生效。 https://www.ruiwen.com/kaitibaogao/6226666.html
7.2022届电计系物联网工程专业优秀毕业设计作品新闻资讯4、基于Java的网上电子书店的设计与实现 1)作品简要介绍 伴随着互联网的迅速发展,电子商务逐步火热,大多数传统行业受到电子商务的冲击从而进军互联网,开启网络购物新时代,图书行业也不例外。而本设计-基于Java的网上电子书店就是以此为契机,以满足用户和管理员的基本需求为目的进行的一款多功能网上电子书店系统。其简洁...https://zsb.cdutetc.cn/c/45ff55e1-72d0-4664-bb0f-8b96e98d6aab.html
8.Java实现网上书店管理系统(idea+MySQL+navicat)前端开发最近一直在做网上书店管理系统,现在这个项目已基本具有一个图书管理系统的雏形,实现了数据的增删改查功能。本项目采用swing技术开发,使用数据库存放具体数据,现在做一个总结,供学习参考! 文章目录 1. 开发工具 2.数据库设计 3. 项目功能设计 1.登录界面设计 2.图书信息维护界面 3.图书信息查询界面 4.图书销售信息...http://www.licqi.com/artikel/9559.html
9.基于SSM的图书商城的设计与实现(文末附源码)传统销售渠道的发展和补充,即网上销售图书也是未来图书销售的趋势。根据图书行业工作者的分析,我国在线图书销售将成为未来图书销售渠道中的重要渠道。为了充分利用现有资源,提高工作效率并减少人工成本,我决定开发一个书店系统。在线图书销售所需功能该系统已初具雏形。用户操作简单,界面直观,系统管理员的管理操作简便。 该...https://cloud.tencent.com/developer/article/1964518
10.包头市昆都仑区“十四五”数字经济发展规划目前,昆都仑区数字化转型存在着全局协调性不够的问题,亟待打破技术的碎片化和制度的碎片化,以及数据孤岛难题,真正打通从研发设计到生产制造、经营管理的瓶颈,实现从理论创新逐渐延伸到应用创新,从基础科学研究加速到产业化应用。 3、生态系统不健全,人才等要素供给不足...https://www.kdl.gov.cn/detail/cid/1661/aid/113900
11.代码货栈基于JSP和SQL Server实现的网上招标系统 立即获取 查看详情 JSP项目 源码+数据库 基于JSP和SQL Server 2008实现的网上手机销售系统 立即获取 查看详情 JSP项目 源码+数据库 基于JSP和Oracle的网上招聘系统的设计与实现 立即获取 查看详情 JSP项目 源码+数据库 ?...https://cs-work.com/