当前位置: 移动技术网 > IT编程>开发语言>.net > asp.net core系列 63 领域模型架构 eShopOnWeb项目分析 上

asp.net core系列 63 领域模型架构 eShopOnWeb项目分析 上

2019年05月14日  | 移动技术网IT编程  | 我要评论

《蜜桃成熟时》,鬼君的替嫁王妃,假性尖锐湿疣症状

一.概述

  本篇继续探讨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企业级应用架构设计 第二版

    

    

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网