asp.netcore系列63领域模型架构eshoponweb项目分析上(代码片段)

mrhsr mrhsr     2022-12-09     236

关键词:

一.概述

  本篇继续探讨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程序,使用默认的用户名和密码进行登录: [email protected]   [email protected]。 项目包括二个模块功能,一个是订单管理,一个是用户管理。

技术图片

 

   参考资料

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

    常用的web架构

    

asp.netcore系列48identity身份模型自定义(代码片段)

原文:asp.netcore系列48Identity身份模型自定义一.概述  ASP.NETCoreIdentity提供了一个框架,用于管理和存储在ASP.NETCore应用中的用户帐户。 Identity添加到项目时单个用户帐户选择作为身份验证机制。 默认情况下,Identity可以使... 查看详情

asp.netcore教程

第一章.NetCore入门1.netcore入门第二章.NetCore重难点知识2.1C#新语法2.2异步编程2.3LINQ第三章.NetCore核心基础组件3.1依赖注入3.2配置系统3.3日志第四章EntityFrameworkCore基础4.1EFCore4.2EFCore的实体配置4.3数据库迁移4.4关系配置第五章EFCore高... 查看详情

基于asp.netcore6.0的整洁架构,asp.netcore6.0功能

背景最近尝试录制了一个系列视频:《ASP.NETCore6.0+Vue.js3实战开发》,本节是视频内部整洁架构的理论和实战的文字稿。因为在录制之前,我通常会编写完整的文字内容作为视频文案,这里分享给大家,希望... 查看详情

tornado系列项目之基于领域驱动模型架构设计的京东用户管理后台(代码片段)

   本博文将一步步揭秘京东等大型网站的领域驱动模型,致力于让读者完全掌握这种网络架构中的“高富帅”。一、预备知识:1.接口:python中并没有类似java等其它语言中的接口类型,但是python中有抽象类和抽象方法。如... 查看详情

基于asp.netcore6.0的整洁架构(代码片段)

背景最近尝试录制了一个系列视频:《ASP.NETCore6.0+Vue.js3实战开发》,本节是视频内部整洁架构的理论和实战的文字稿。因为在录制之前,我通常会编写完整的文字内容作为视频文案,这里分享给大家,希望... 查看详情

netcore体系-web应用程序-4asp.netcore2.0项目实战-3项目架构说明(代码片段)

...4.总结1. 摘要  NCMVC角色权限管理框架是由最近练习NetCore时抽时间整理的系统,后续能不能发展成一个cms还要看朋友们是否有需要或时间是否充实。这里NCMVC主要还是给想要学习接触Asp.NetCore2.0的朋友们提供一些借鉴以及坑... 查看详情

探索abp基础架构

为了了解应用程序是如何配置和初始化,本文将探讨ASP.NETCore和ABP框架最基本的构建模块。我们将从ASP.NETCore的Startup类开始了解为什么我们需要模块化系统,以及ABP如何提供模块化方式来配置和初始化应用程序。然后我们将探索A... 查看详情

asp.netcore打造一个简单的图书馆管理系统基本模型以及数据库的建立(代码片段)

...:https://docs.microsoft.com/zh-cn/aspnet/core/getting-started/?view=aspnetcore-2.1&tabs=windows《ProASP.NETMVC5》、《锋利的jQuery》 此系列皆使用V 查看详情

asp.netcore打造一个简单的图书馆管理系统基本模型以及数据库的建立(代码片段)

...:https://docs.microsoft.com/zh-cn/aspnet/core/getting-started/?view=aspnetcore-2.1&tabs=windows《ProASP.NETMVC5》、《锋利的jQuery》 此系列皆使用V 查看详情

你真的了解asp.netcore部署模型吗?(代码片段)

原文:你真的了解ASP.NETCore部署模型吗? ----------------------------   以下内容针对ASP.NETCore2.1,2.2出现IIS进程内寄宿暂不展开讨论--------------------------      相比ASP.NET,ASP.NETCore 查看详情

asp.net管道模型和asp.netcore的middleware模型的对比

    查看详情

asp.netcore部署系列一:发布到iis上

前言: 当构建一个ASP.NETCore应用程序并且计划将其运行在IIS中时,你会发现Core应用程序和之前版本的ASP.NET程序在IIS中的运行方式是完全不一样的。与ASP.NET时代不同,ASP.NETCore不再是由IIS工作进程(w3wp.exe)托管,而是使用自... 查看详情

成为架构师系列:怎样画系统架构图?背后的本质是对问题的本质思考

开发人员必须钻研领域以获取业务知识。他们必须磨砺其建模技巧,并精通领域设计。Eric《Domain-DrivenDesign》所谓的领域建模,是一种通过日常不断实践,来强化开发人员思维,逼迫开发人员进入深度思考的过程&#... 查看详情

[十二]asp.netcore中的模型绑定(代码片段)

模型绑定1、模型绑定(1)HTTP请求数据2、ASP.NETCore中的模型验证(1)ModelState.IsValid属性验证(2)在视图中显示模型验证错误(3)自定义模型验证错误消息1、模型绑定模型绑定是将HTTP请求中的数据... 查看详情

[十二]asp.netcore中的模型绑定(代码片段)

模型绑定1、模型绑定(1)HTTP请求数据2、ASP.NETCore中的模型验证(1)ModelState.IsValid属性验证(2)在视图中显示模型验证错误(3)自定义模型验证错误消息1、模型绑定模型绑定是将HTTP请求中的数据... 查看详情

asp.netcore系列6实战之一个项目的完整结构(代码片段)

0.前言在《asp.netcore系列》之前的几篇文章中,我们简单了解了路由、控制器以及视图的关系以及静态资源的引入,让我们对于asp.netcoremvc项目有了基本的认识。不过,这些并不是asp.netcoremvc项目的全部内容,剩下的内容我将结合... 查看详情

.netcore系列:1环境搭建

前言:    2016年6月28日微软宣布发布.NETCore1.0、ASP.NETCore1.0和EntityFrameworkCore1.0。.NETCore是微软在两年前发起的开源跨平台.NET框架项目,支持Windows、OSX和Linux平台,可用于开发各种类型的应用。此次发布包括了.NETCore... 查看详情

从零写一个asp.netcore手脚架(模型验证)(代码片段)

一个asp.netcore项目,一定包含了各种的实体,在RESTfulapi里面,有很多的参数传递,不建立实体则大量的参数需要自定验证正确性,并且Action上面会写的密密麻麻的参数在asp.net2.0的时候,就推出了ModelState,顾名思义,这个是模型... 查看详情