一.概述
本篇继承讨论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 voidConfigureDevelopmentServices(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架构
Comment here is closed