领域模型架构 eShopOnWeb项目分析 上
一.概述
本篇继续探讨web应用架构,讲基于DDD风格下最初的领域模型架构,不同于DDD风格下CQRS架构,二者架构主要区别是领域层的变化。 架构的演变是从领域模型到CQRS, 一开始DDD是用领域模型的分层架构,用单一的领域模型处理业务逻辑的所有方法,特别是命令和查询,这可能导致复杂性直线上升,CQRS是留住了DDD的优点又能使实现变得简单高效。
同样作为DDD领域驱动设计下的支持架构包括:领域模型架构和CQRS架构。虽然CQRS架构相比领域模型架构更受欢迎推荐,但领域模型架构也同样需要了解和掌握。
在软件行业经过多年的传统三层开发后,演变出了DDD领域驱动设计。传统三层是UI层调用BLL层,BLL层调用DAL层,每层都有自己熟知的职责。但是缺点是编译时依赖关系由上而下运行,是一种高藕合,依赖程序太大,而在设计原则中应该是低藕合,越低越好。
1.1 Clean architecture
Clean architecture 被称为“干净架构"。遵循依赖倒置原则以及领域驱动设计原则 (DDD) 的应用程序倾向于达到类似的架构。此依赖关系被倒置是:基础架构层和实现细节依赖于领域层,通过在领域层定义抽象或接口。然后由基础设施层中定义的具体类型来实现接口。理解这点很重要。
比例在上篇项目中,由Equinox.Infra.Data数据访问层的Repository文件夹来实现领域层的IRepository接口。由Equinox.Infra.CrossCutting.Bus 层 命令总线的InMemoryBus类实现领域层的IMediatorHandler接口。
下图是DDD干净架构多层以"同心圆"形式展示。通过下图可以了解到:依赖关系流向最里面的圆。application core位于此关系图的核心位置而得名,该application core没有任何依赖项。application core的Entities和Interfaces位于正中心,正中心外圈是application core的域服务,域服务通常调用内圈中定义的Interfaces接口。application core外面UI(应用服务层)和基础设施层都依赖于application core。
User Interface是表现层包括:控制器和视图模型(包括了应用服务层)。
Infrastructure是基础设施层包括:仓储,其它服务实现。
application core是领域层包括:领域服务,领域实体,领域接口 (来基础设施层来实现)。
下图更好的反映了DDD各层的依赖关系,实线箭头表示编译时依赖关系,而虚线箭头表示仅运行时依赖关系。领域层是架构的核心层,不依赖于基础设施层,该层是可测试的。基础设施层引用领域层来实现数据持久化或横切关注点。
下图是asp.net core web应用程序在DDD领域模型方案中完整构架,展现了各层明确的职责分布,虚线指编译依赖关系,也可以理解为项目引用关系,实线则是运行依赖关系。
在了解DDD领域模型构架分层后。接下来分析eShopOnWeb项目,来掌握DDD下的领域模型架构。下面是二个有代表性的领域模型架构项目,以微软的官方示例eShopOnWeb项目做重点分析。在分析中主要去了解领域层内部是怎么实现的,以及业务处理流程代码实现。
二.项目介绍
2.1. IBuyStuff-dm项目
IBuyStuff-dm项目是"Microsoft.net企业级应用架构设计"一书的项目案例(asp.net mvc项目)。从github上下载源码,需要在IBuyStuff.Server项目中安装mvc5(没果没有mvc5), 安装命令如下:
Install-Package Microsoft.AspNet.Mvc -Version 5.0.0
项目结构如下所示(左图为项目结构,右图为领域层二个类库):
项目分层说明: IBuyStuff.Server为表现层
IBuyStuff.Application为应用服务层
IBuyStuff.Domain为领域模型层
IBuyStuff.Domain.Services为领域服务层
IBuyStuff.Persistence为基础设施层
2.2 eShopOnWeb项目
在ASP.NET Core技术出来后,微软官方给出了一个eShopOnWeb项目案例(asp.net core mvc项目)。该项目演示了一些原则和建议, 是一个简单在线商店,支持浏览衬衫、咖啡杯和其他市场产品名录。项目结构如下所示:
项目分层说明:
Web包括表现层,应用服务层。其中Services文件夹和Interfaces文件夹代表是应用服务层,在上篇中说到,表现层和应用服务层都属于前端系统范围。
ApplicationCore领域层,包括了领域内部的所有实现。
Infrastructure基础设施层。主要是EF数据持久化。
tests文件夹包括了一系列完整的测试项目。
三. 项目配置
3.1 启用数据库类型
下载了eShopOnWeb项目后,在Startup.cs的ConfigureDevelopmentServices方法中,可以选择是基于内存或sql server存储,我们选择使用sql server。
public void ConfigureDevelopmentServices(IServiceCollection services) {// use in-memory database// ConfigureInMemoryDatabases(services); // use real database ConfigureProductionServices(services); }
3.2 修改数据库链接地址
修改appsettings.json文件中的数据库连接,对应的两个数据库CatalogDb,Identity。
CatalogDb数据库用于商店的目录数据和购物车信息,Identity数据库用于应用程序的用户凭据和身份数据。
3.3 同步到数据库
在vs2017中使用“程序包管理器控制台“默认项目选择Infrastructure,同步两个EF上下文到数据库。
PM> Update-Database -C AppIdentityDbContext PM> Update-Database -C CatalogContext
同步后,生成的两个数据库,下面展示了CatalogDb业务数据库的关系图,如下所示:
Orders表是用户订单信息,包含了送货地址信息。
OrderItems表是订单商品信息。
Catalog是商城商品信息
CatalogBrand是商城商品品牌信息
CatalogType是商城商品类别。比如T-Shirt衬衫,Mug杯子
Baskets 是购物车
BasketItem是购物车商品信息。
启动运行eShopOnWeb程序,使用默认的用户名和密码进行登录: demouser@microsoft.com Pass@word1。 项目包括二个模块功能,一个是订单管理,一个是用户管理。
参考资料
Microsoft.NET企业级应用架构设计 第二版
常用的web架构
原文地址:https://www.cnblogs.com/MrHSR/p/10855824.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
\
领域模型架构 eShopOnWeb项目分析 上相关推荐
- 结合eShopOnWeb全面认识领域模型架构
一.项目分析 在上篇中介绍了什么是"干净架构",DDD符合了这种干净架构的特点,重点描述了DDD架构遵循的依赖倒置原则,使软件达到了低藕合.eShopOnWeb项目是学习DDD领域 ...
- NVIDIA Turing Architecture架构设计(上)
NVIDIA Turing Architecture架构设计(上) 在游戏市场持续增长和对更好的 3D 图形的永不满足的需求的推动下, NVIDIA ®已经将 GPU 发展成为许多计算密集型应用的世界 ...
- 特斯拉Tesla Model 3整体架构解析(上)
特斯拉Tesla Model 3整体架构解析(上) 一辆特斯拉 Model 3型车在硬件改造后解体 Sensors for ADAS applications 特斯拉 Model 3型设计的传感器组件 ...
- 某游戏服务运维架构进化史(上云方案)
某游戏服务运维架构进化史(上云方案) 星锅说事2020-10-13 17:28:05 什么是网站架构 网站架构百度百科:网站架构,一般认为是根据客户需求分析的结果,准确定位网站目标群体,设定网站整体架 ...
- 在arm架构的mac上安装sql server(m1芯片 or m2芯片)
在arm架构的mac上安装sql server 由于Mac最新的芯片使用了arm架构的缘故 Sql server和Mac的兼容相当差,以至于无法在Mac的docker上启动 在m1芯片上很多方法试试还 ...
- spring boot+iview 前后端分离架构之文件上传的实现(三十一)
spring boot 与 iview 前后端分离架构之文件上传的实现(三十一) 公众号 文件上传 前端改造 main.js引入配置的全局变量 编写baseImgUpload图片上传组件 baseIm ...
- 鲁班学院-java架构师线上培训机构哪家好
2020年的开年对于我们来说打击是很大的,但是对于中华儿女的我们来说在面对苦难的时候都是众志成城的度过难关的.面对这些的武汉疫情,我们的中国儿女也是跟随着国家的步伐来抗"疫情"在疫 ...
- 在英特尔架构 Android* 设备上 HTML5 应用中创建劲酷动画与切换
作者:Tao Wang (Intel) 平板电脑和智能手机等移动设备日益普及,Adobe Flash* 插件需要被替代. 最近 Adobe 宣称 Flash 不再支持移动设备. 因此 HTML5 是未 ...
- 基于BPMN2.0的工单系统架构设计(上)
版权声明: 本文为博主原创文章,未经博主允许不得转载.关注公众号 技术汇(ID: jishuhui_2015) 可联系到作者. 一.前言 『工单系统』从宏观上看,是一些状态流的转换,笔者认为,工单系统 ...
最新文章
- Proximal Algorithms 4 Algorithms
- 为什么我们会被这种 “提前退休” 的节奏逼疯?
- linux超级基础系列——shell变量(本地变量和环境变量)
- 不要担心,我可以一个人走
- C++五子棋(三)——判断鼠标有效点击
- java 加密 数字_java 加密数字签名
- RabbitMQ pull与push的区别
- Django讲课笔记08:定义商城的数据模型
- 易语言中动态地址的理解
- Python 数据结构与算法 —— Prim 算法与小顶堆
- 开发过程中解决各种跨域问题
- android 辅助功能_关于辅助功能的9个神话
- 读书笔记:自动控制原理
- Centos 7 虚拟机启动,Entering emergency mode问题解决
- 广东省清远市谷歌卫星地图下载
- 做人要知足、做事要知不足、做学问要不知足
- 【BZOJ1062】糖果雨(NOI2008)-数形结合+二维树状数组
- WORD “锁定标记”的功能
- html 滚动字幕如何设置,如何制作滚动字幕 视频画面加滚动字幕,自己设置滚动字幕的显示时间(滚动次数)...
- Java使用Spire.Pdf实现PDF添加图片水印