领域模型架构 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。

640?wx_fmt=png

      User Interface是表现层包括:控制器和视图模型(包括了应用服务层)。

      Infrastructure是基础设施层包括:仓储,其它服务实现。

      application core是领域层包括:领域服务,领域实体,领域接口 (来基础设施层来实现)。

    下图更好的反映了DDD各层的依赖关系,实线箭头表示编译时依赖关系,而虚线箭头表示仅运行时依赖关系。领域层是架构的核心层,不依赖于基础设施层,该层是可测试的。基础设施层引用领域层来实现数据持久化或横切关注点。

640?wx_fmt=png

    下图是asp.net core web应用程序在DDD领域模型方案中完整构架,展现了各层明确的职责分布,虚线指编译依赖关系,也可以理解为项目引用关系,实线则是运行依赖关系。

640?wx_fmt=png

   在了解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

    项目结构如下所示(左图为项目结构,右图为领域层二个类库):

640?wx_fmt=png

           项目分层说明: IBuyStuff.Server为表现层

                                        IBuyStuff.Application为应用服务层

                                        IBuyStuff.Domain为领域模型层

                                        IBuyStuff.Domain.Services为领域服务层

                                        IBuyStuff.Persistence为基础设施层    

  2.2  eShopOnWeb项目

    在ASP.NET Core技术出来后,微软官方给出了一个eShopOnWeb项目案例(asp.net core mvc项目)。该项目演示了一些原则和建议, 是一个简单在线商店,支持浏览衬衫、咖啡杯和其他市场产品名录。项目结构如下所示:

640?wx_fmt=png

           项目分层说明:

                     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业务数据库的关系图,如下所示:

640?wx_fmt=png 

    Orders表是用户订单信息,包含了送货地址信息。

    OrderItems表是订单商品信息。

    Catalog是商城商品信息

    CatalogBrand是商城商品品牌信息

    CatalogType是商城商品类别。比如T-Shirt衬衫,Mug杯子

    Baskets 是购物车

    BasketItem是购物车商品信息。

    启动运行eShopOnWeb程序,使用默认的用户名和密码进行登录: demouser@microsoft.com   Pass@word1。 项目包括二个模块功能,一个是订单管理,一个是用户管理。

640?wx_fmt=png

   参考资料

    Microsoft.NET企业级应用架构设计 第二版

    常用的web架构

原文地址:https://www.cnblogs.com/MrHSR/p/10855824.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg\

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

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

相关文章

最小生成树--Boruvka算法

参考文章 介绍 第一次听说这个算法。。 对于最小生成树一定学过prim和krusal,prim复杂度是O(n2)或者O(elogn)O(n^2)或者O(elogn)O(n2)或者O(elogn),krusal复杂度是O(eloge)O(eloge)O(eloge),这里介绍一下Boruvka算法 Boruvka算法解决某些特定问题非常好…

[NOIP2016]愤怒的小鸟(状压DP)

[NOIP2016]愤怒的小鸟(状压DP) 题目描述 输入输出格式 输入格式: 第一行包含一个正整数 T,表示游戏的关卡总数。 下面依次输入这 T个关卡的信息。每个关卡第一行包含两个非负整数 n,m,分别表示该关卡中的小猪数量和…

给 asp.net core 写一个简单的健康检查

给 asp.net core 写一个简单的健康检查Intro健康检查可以帮助我们知道应用的当前状态是不是处于良好状态,现在无论是 docker 还是 k8s 还是现在大多数的服务注册发现大多都提供了健康检查机制来检测应用的健康状态,如果应用本身就提供一个健康检查的机制…

从阿里中台战略看企业IT架构转型之道(下)

此文是我阅读《企业IT架构转型之道》一书的学习笔记的下半部分,所有内容出自钟华老师的这本书。上半部分Part1~Part5请点击这里Part 6 异步与缓存原则异步化事务 > 核心是ACID柔性事务 > 基础是CAP理论和BASE理论,因为互联网应用最核心的需求是高可…

CF1543C. Need for Pink Slips

CF1543C. Need for Pink Slips 题意: 题解: 其实具体的计算方法在说明里面都写了:对于第一个数据: 0.2 0.2 0.6 0.2组成方案如下: 就是c和m如果大于v就减,小于v就变成0,到p直接停止 所以直接…

并查集(并茶几)

并查集(并茶几)的应用 一、What‘s that? 并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。 ——百度百科 二、How to uphold 0.我们的需…

从阿里中台战略看企业IT架构转型之道(上)

此文是我阅读《企业IT架构转型之道》一书的学习笔记的上半部分,所有内容出自钟华老师的这本书。零、为何阅读《企业IT架构转型之道》在加入X公司后,开始了微服务架构的实践,也开始了共享平台服务的建设,在这方面阿里巴巴的中台战略…

ML.NET机器学习、API容器化与Azure DevOps实践(四):持续集成与k8s持续部署

通过上文所介绍的内容,我们已经完成了RESTful API的开发,现在,就可以使用Azure DevOps来进行持续集成(CI)和k8s持续部署(CD)了。本文我会对使用Azure DevOps进行CI/CD的过程中需要注意的地方进行…

P3195 [HNOI2008]玩具装箱

P3195 [HNOI2008]玩具装箱 题意: n件玩具,第i件玩具经过压缩后的一维长度为CiC_iCi​,现在把玩具装入一维容器中,要求: 在一个一维容器中的玩具编号是连续的如果一个一维容器中有多个玩具,那么两件玩具之间要加入一…

卷积与莫比乌斯反演

卷积与莫比乌斯反演 目录 卷积与莫比乌斯反演 0前言 0.1前置技能 0.2问题的引入 1.简单定义 1.1数论函数的定义 1.2卷积的定义 1.3反演的基本形式 2.1莫比乌斯反演 3.1例题:【luogu-P2257 YY的GCD】 题目大意: solution1 solution2 0.前言 莫比…

ML.NET机器学习、API容器化与Azure DevOps实践(三):RESTful API

通过上文所述案例,我们已经选择了最优回归算法来预测学生的综合成绩,并且完成了基于训练数据集的预测模型训练。从实现上,训练好的模型被保存成一个ZIP文件,以便在其它项目中直接调用以完成机器学习的实践场景。在本文中&#xff…

杜教筛

杜教筛 1.概述 杜教筛是用以解决积性函数前缀和的算法。 在学习了莫比乌斯反演之后,杜教筛的过程就会显得简单而自然。 2.基本形式 对于积性函数,我们定义如下函数: 构造积性函数 ,使得 显然 : 进一步转化&#xf…

ML.NET机器学习、API容器化与Azure DevOps实践(二):案例

在上文中,我简单地介绍了机器学习以及ML.NET的相关知识,从本讲开始,我会基于一个简单的案例:学生成绩预测,来介绍使用ML.NET进行机器学习以及API部署的基本过程。本案例的数据来源为加州大学尔湾分校的机器学习公开样本…

业界萌新对斯坦纳树的小结

业界萌新对斯坦纳树的小结 0.简介 斯坦纳树问题是组合优化问题,与最小生成树相似,是最短网络的一种。最小生成树是在给定的点集和边中寻求最短网络使所有点连通。而最小斯坦纳树允许在给定点外增加额外的点,使生成的最短网络开销最小。 ——…

cf1208E. Let Them Slide

cf1208E. Let Them Slide 题意: 都放在一个长度为W的框里面。有n个序到,第i个序列的长度是1。这些序到并排放在一起,每一个序列都放在一个长度为w的框里 这些序列可以在框里面滑动,但是不能划出框。 对于每一个位置&#xff0…

结合eShopOnWeb全面认识领域模型架构

一.项目分析在上篇中介绍了什么是"干净架构",DDD符合了这种干净架构的特点,重点描述了DDD架构遵循的依赖倒置原则,使软件达到了低藕合。eShopOnWeb项目是学习DDD领域模型架构的一个很好案例,本篇继续分析该项目各层的职…

SOS_dp算法

Codeforces博客 简介: 前置知识:状压dp Sum over Subsets dynamic programming,简称Sos dp,状压dp的一种 用一个列题引出SOS dp: 给你一个由2N2^N2N个整数组成的确定数组A,我们需要计算对于任意的x,F(x)所…

微软开源Bing搜索背后的关键算法

微软今天宣布开源了一项 Bing 搜索背后的关键算法 —— SPTAG,它使 Bing 能够快速将搜索结果返回给用户。仅在几年前,网络搜索很简单,用户输入几个关键词然后浏览结果页面。现如今,这些用户可能会在手机上拍照并将其放入搜索框中&…

Stern-Brocot Tree

Stern-Brocot Tree 0.简介 Stern-Brocot Tree,俗称SB树(滑稽)。它能够表示出所有的最简分数,如下图。 1.一些规律 显然,对于两个相邻的最简分数 可以得到另一个最简分数 这样就可以在Stern-Brocot Tree上表示出所有…

FWT(快速沃尔什变换)

文章目录引入:or卷积and卷积xor卷积IFWT模板:例题:引入: FFT/NTT是用来解决∑ijkA[i]B[j]\sum_{ijk}A[i]B[j]∑ijk​A[i]B[j]的式子 而FWT是用来解决Ci∑j⊕kiAjBkC_i\sum_{j⊕ki}A_jB_kCi​∑j⊕ki​Aj​Bk​ ​ FWT是一种用于处…