虽然每天的工作都是CURD、还是使用着传统的三层架构、使用着.net Framework,但是这并不能影响我学习DDD和.net core。

总是希望软件在应对复杂多变的场景时能够游刃有余,在解决问题时能够多一种选择。

很早就有关注大神dax.net的NLayerApp系列博文https://www.cnblogs.com/daxnet/category/304141.html

近期入坑.net core,看了进击的辣条的文章Asp.Net Core微服务初体验,很有收获,感谢感谢。

抽时间读了下NLayerAppV3项目的源码,Github地址:https://github.com/cesarcastrocuba/nlayerappv3

分享下体会,希望相互交流学习,谢谢!

1、项目简介

NLayerAppV3是一个使用.net 2.1实现的经典DDD的分层架构的项目。

NLayerAppV3是在NLayerAppV2的基础上,使用.net core2.1进行重新构建的;它包含了开发人员和架构师都可以重用的DDD层;以银行和博客上下文示例。

2、项目结构

放一张DDD风格架构l图。主要分为四层:表现层、应用层、领域层和基础结构层。

详细的各层的含义可以查看dax.net的文章https://www.cnblogs.com/daxnet/archive/2011/05/10/2042095.html

1.1-Presentation(表现层)

系统和用户的交互层。UI展示给终端用户、收集用户的反馈信息。

1.2-Distributed Services(分布式服务层)

为应用程序提供远程访问;如果是http协议,一般设计为WebApi。

1.2.1-Seedwork --DistributedServices.Seedwork

分布式服务的Controller、Filter等

1.2.2-MainBoundedContext

--DistributedServices.MainBoundedContext

以银行的业务示例,构建上下文、对外提供WebApi服务,结合Swagger UI

--DistributedServices.MainBoundedContext.Tests

DistributedServices.MainBoundedContext的测试项目

1.2.3-BlogContext

--DistributedServices.BlogBoundedContext

以博客业务示例,构建上下文,对外提供WebApi服务,结合Swagger UI

--DistributedServices.BlogBoundedContext.Tests

DistributedServices.BlogBoundedContext项目的测试项目

1.3-Application(应用层)

协调领域模型与其它应用、包括事务调度、UOW、数据转换等。

主要作用:通过仓储来访问持久层;对不同领域的数据组织整理;协调领域对象之间、领域对象与基础层的协作关系;应用服务等

1.3.1-Seedwork --Application.Seedwork

应用层共用接口、实现的封装

1.3.2-MainBoundedContext

--Application.MainBoundedContext

业务模块的应用层服务接口和实现

--Application.MainBoundedContext.DTO

应用层业务模块的数据转换等

--Application.MainBoundedContext.Tests

Application.MainBoundedContext的测试项目

1.3.3-BlogBoundedContext

同1.3.2,不同的是业务换为博客业务

1.4-Domain(领域层)

展现业务/领域逻辑、业务处理状态,以及实现业务规则,它同时也包含了领域对象的状态信息。

1.4.1-Seedwork

--Domain.Seedwork

领域层实体基类、仓储接口、UOW接口、值对象基类、规约等

--Domain.Seedwork.Tests

Domain.Seedwork的测试项目

1.4.2-MainBoundedContext

--Domain.MainBoundedContext

实体、值对象、领域服务、聚合根、聚合及工厂

--Domain.MainBoundedContext.Tests

Domain.MainBoundedContext的测试项目

1.4.3-BlogBoundedContext

同1.4.2 业务逻辑换成了博客

1.5-Infrastructure(基础设施层)

1.5.1-Data  

为应用程序的数据存取提供服务,它可以是应用程序本身的持久化机制,也可以是外部系统提供的数据访问的Web Service等

--Infrastructure.Data.Seedwork

UOW的实现基类、仓储的实现基类

--Infrastructure.Data.MainBoundedContext

UOW的实现、仓储的实现

--Infrastructure.Data.MainBoundedContext.Tests

Infrastructure.Data.MainBoundedContext的测试项目

1.5.2-CrossCutting 

该层提供了能被其它各层访问的通用技术框架,比如异常捕获与处理、日志、认证、授权、验证、跟踪、监视、缓存等等。

--Infrastructure.Crosscutting

适配器、国际化、验证等接口的封装

--Infrastructure.Crosscutting.NetFramework

适配器、国际化、验证等实现、国际化依赖的资源

--Infrastructure.Crosscutting.Tests

Infrastructure.Crosscutting的测试项目

3、示例

以DistributedServices.MainBoundedContext项目的BankAccounts的转账api示例,说明下我的理解

[HttpPut]public void PerformTransfer([FromBody]BankAccountDTO from, [FromBody]BankAccountDTO to, [FromBody]decimal amount){_bankAppService.PerformBankTransfer(from, to, amount);}

View Code

_bankAppService通过构造函数注入。

readonly IBankAppService _bankAppService;public BankAccounts(IBankAppService bankAppService){_bankAppService = bankAppService;}

View Code

IBankAppService是应用层的服务接口

对应的应用层有接口的实现BankAppService

public BankAppService(IBankAccountRepository bankAccountRepository, // the bank account repository dependencyICustomerRepository customerRepository, // the customer repository dependency
                              IBankTransferService transferService,ILogger<BankAppService> logger){//check preconditionsif (bankAccountRepository == null)throw new ArgumentNullException("bankAccountRepository");if (customerRepository == null)throw new ArgumentNullException("customerRepository");if (transferService == null)throw new ArgumentNullException("trasferService");_bankAccountRepository = bankAccountRepository;_customerRepository = customerRepository;_transferService = transferService;_logger = logger;_resources = LocalizationFactory.CreateLocalResources();}

View Code

BankAppService通过构造函数注入了领域层的银行账号仓储IBankAccountRepository和客户仓储ICustomerRepository、转账服务等,全部依赖于接口。

public void PerformBankTransfer(BankAccountDTO fromAccount, BankAccountDTO toAccount, decimal amount){//Application-Logic Process: // 1º Get Accounts objects from Repositories// 2º Start Transaction// 3º Call PerformTransfer method in Domain Service// 4º If no exceptions, commit the unit of work and complete transactionif (BankAccountHasIdentity(fromAccount)&&BankAccountHasIdentity(toAccount)){var source = _bankAccountRepository.Get(fromAccount.Id);var target = _bankAccountRepository.Get(toAccount.Id);if (source != null & target != null) // if all accounts exist
                {using (TransactionScope scope = new TransactionScope()){//perform transfer
                        _transferService.PerformTransfer(amount, source, target);//comit unit of work
                        _bankAccountRepository.UnitOfWork.Commit();//complete transaction
                        scope.Complete();}}else_logger.LogError(_resources.GetStringResource(LocalizationKeys.Application.error_CannotPerformTransferInvalidAccounts));}else_logger.LogError(_resources.GetStringResource(LocalizationKeys.Application.error_CannotPerformTransferInvalidAccounts));}

View Code

实现转账的功能,输入参数都是Dto对象,通过AutoMapper或者其它映射工具完成数据转换;通过仓储访问聚合,获取源和目标账号信息、开启事务,UOW提交转账操作。

DistributedServices.MainBoundedContext的StartUp中注册IOC

仓储、领域服务、应用层服务、适配器、国际化、验证、Swagger UI等。

运行项目

在DistributedServices.MainBoundedContext目录下打开cmd命令,输入dotnet restore,完成之后,输入dotnet run

运行结果:

4、想法和计划

跟.net core microservice结合

使用ocelot搭建服务网关、结合identityserver4实现授权认证;polly服务熔断;限流;consul服务发现;Appolo配置中心;Skywalking追踪结果。

转载于:https://www.cnblogs.com/net-yuan/p/NLayerAppV3.html

NLayerAppV3--.net Core2实现的DDD分层架构相关推荐

  1. DDD分层架构最佳实践

    还在单体应用的时候就是分层架构一说,我们用得最多的就是三层架构.而现在已经是微服务时代,在微服务架构模型比较常用的有几个,例如:整洁架构,CQRS(命令查询分离)以及六边形架构.每种架构模型都有自己的 ...

  2. 这 3 种 DDD 分层架构的模式,你掌握了么?

    -     前言    - 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和分层架构的相关知识. -     DDD 的基本概念     - DDD(Domain DrivenDesign, ...

  3. DDD分层架构的三种模式

    本文来说下DDD分层架构的三种模式 文章目录 概述 DDD 分层架构 模式一:四层架构 模式二:五层架构 模式三:六边形架构 本文小结 概述 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和 ...

  4. 应用程序框架实战十八:DDD分层架构之聚合

    前面已经介绍了DDD分层架构的实体和值对象,本文将介绍聚合以及与其高度相关的并发主题. 我在之前已经说过,初学者第一步需要将业务逻辑尽量放到实体或值对象中,给实体"充血",这样可以 ...

  5. 还在搞三层架构?了解下 DDD 分层架构的三种模式吧 !

    来源:jianshu.com/p/a775836c7e25 引言 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和分层架构的相关知识. DDD DDD(Domain DrivenDesign ...

  6. 还在搞三层架构?了解下 DDD 分层架构的三种模式吧

    引言 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和分层架构的相关知识. DDD DDD(Domain Driven Design,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高 ...

  7. 微服务化与DDD—分层架构、洋葱架构、六边形架构 架构设计

    1.0 DDD分层架构 分层架构,每一层,只与自己下一层发生耦合,类似于网络的7层或TCP/IP的4层模型架构,每一层各司其职,并且只关心向下一层的实现,而不会出现各层耦合. 2.0 洋葱架构 同心圆 ...

  8. DDD—分层架构、洋葱架构、六边形架构

    一.DDD分层架构 DDD分层架构中有很重要的依赖原则:每层只能与位于下方的层发生耦合,类似于网络的7层或TCP/IP的4层模型架构,每一层各司其职,并且只关心向下一层的实现,而不会出现各层耦合. D ...

  9. 什么是DDD分层架构

    还在单体应用的时候就是分层架构一说,我们用得最多的就是三层架构.而现在已经是微服务时代,在微服务架构模型比较常用的有几个,例如:整洁架构,CQRS(命令查询分离)以及六边形架构.每种架构模型都有自己的 ...

最新文章

  1. 网游生命周期在百度指数曲线上呈“M”形分布,各阶段搜索行为呈一定特征
  2. python 定义字典键为变量_在python字典中使用变量作为键名
  3. OC实例变量和属性-@synthesize与@property
  4. yolov5 tensorrt
  5. Flyweight Design Pattern 共享元设计模式
  6. 11.29 广州国际设计周
  7. 【Java】为什么java构造函数的构造器只能在第一行写this() 或者super() ?
  8. java arraylist对象_Java中ArrayList的对象引用问题
  9. 去掉flash player自带的fff新推荐广告插件
  10. 微信公众平台 使用JS-SDK实现拍照上传功能
  11. linux解压tar文件夹
  12. 个人音乐流媒体服务器mStream
  13. Python中列表,元组,字典的一些基本用法
  14. mysql 查询 本周 上周,Mysql查询本周,上周,本月,上月数据
  15. php程序员述职材料_求一个PHP程序员的试用期转正的述职报告 要求详细一点的 分数不够可以再加,在线急等...
  16. mysql 查询重复字符串_如何在mysql中查询重复的字符串条目
  17. NIPS2019:旷视提出DetNAS:首个搜索物体检测Backbone的方法
  18. 【AI_数学知识】概率论
  19. C++常用头文件汇总
  20. STM32使用Jlink下载出现NO cortex-M SW device Found解决(超详细)

热门文章

  1. 友讯(d-link)dwa-525 150m无线台式计算机网卡,D-Link新款台式机无线网卡即将上市
  2. JS中完美兼容各大浏览器的scrolltop方法
  3. 算法之排序算法-shell排序(交换法)
  4. 关于逻辑删除标识字段value的设定
  5. python 一句话校验软件 hash值
  6. 不同语言,系统通过共享内存方式实现信息交互
  7. iOS开发学习-nonatomic和atomic的区别
  8. Mysql递归查询,无限级上下级菜单
  9. Mybatis日常操作遇到的问题
  10. poj 4468Spy(kmp算法)