aspcore系列63领域模型架构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 core web应⽤程序在DDD领域模型⽅案中完整构架,展现了各层明确的职责分布,虚线指编译依赖关系,也可以理解为项⽬引⽤关系,实线则是运⾏依赖关系。
在了解DDD领域模型构架分层后。接下来分析eShopOnWeb项⽬,来掌握DDD下的领域模型架构。下⾯是⼆个有代表性的领域模型架构项⽬,以微软的官⽅⽰例eShopOnWeb项⽬做重点分析。在分析中主要去了解领域层内部是怎么实现的,以及业务处理流程代码实现。
⼆.项⽬介绍
2.1. IBuyStuff-dm项⽬
项⽬是"Microsoft企业级应⽤架构设计"⼀书的项⽬案例(asp mvc项⽬)。从github上下载源码,需要在
IBuyStuff.Server项⽬中安装mvc5(没果没有mvc5), 安装命令如下:
Install-Package Microsoft.AspNet.Mvc -Version 5.0.0
项⽬结构如下所⽰(左图为项⽬结构,右图为领域层⼆个类库):
asp查看源码配置ui 项⽬分层说明: IBuyStuff.Server为表现层
IBuyStuff.Application为应⽤服务层
IBuyStuff.Domain为领域模型层
IBuyStuff.Domain.Services为领域服务层
IBuyStuff.Persistence为基础设施层
2.2 eShopOnWeb项⽬
在ASP.NET Core技术出来后,微软官⽅给出了⼀个项⽬案例(asp 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 Pass@word1。 项⽬包括⼆个模块功能,⼀个是订单管理,⼀个是⽤户管理。
参考资料
Microsoft.NET企业级应⽤架构设计 第⼆版
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论