一.概述
本章Web架构分层指南,参考了“Microsoft应用程序体系结构指南”(该书是在2009年出版的,当时出版是为了帮助开发人员和架构师更快速,更低风险地使用Microsoft平台和.NET Framework设计和构建有效,高质量的应用程序)。虽然已过去十年了,技术架构已更新(如流行的DDD/CQRS模式,微服务,容器),但web分层思想还是一样可取,下面是一个“传统N分层设计”架构图,该架构在2010年左右是最流行的,包括了表现层presentation,服务层services,业务层business,数据访问层data,横切关注点cross,如下所示:
对比传统多层或三层.net web架构,下图是当前流行的.net web微服务架构,在web程序分层之上还包含了容器,web api网关,各服务对应的数据存储(sqlserver,redis,mongoDB),web程序有web api并结合应用了DDD\CQRS分层模式,以及系统各种中间件。
下图是一个订单微服务站点,包含了简化的cqrs分层,蓝色长方格是表示cqrs分层的职责,包括了查询 Queries viewModels和命令Command Domain-Model以及上层的应用服务层Application,如下所示
1.1 逻辑分层设计架构类型
(1) 最传统的分层是经典三层设计,包括表现层,业务层,数据层.
(2) 基于服务的解决方案SOA,公开应用程序业务功能的服务层,服务层在业务层之上。
(3) 基于领域驱动设计的DDD\CQRS分层模式
(4) 微服务架构。
这4种web分层架构是不断的演化改变 ,每一种分层架构并不是独立的思想,它包含了演化之前的架构分层思想。从以前三层架构到现在的微服务架构,是适应每个时代互联网业务实现的需求。
功能 |
SOA |
微服务 |
组件大小 |
大块业务逻辑 |
单独任务或小块业务逻辑 |
耦合 |
通常松耦合 |
总是松耦合 |
公司架构 |
任何类型 |
小型、专注于功能交叉团队 |
管理 |
着重中央管理 |
着重分散管理 |
目标 |
确保应用能够交互操作 |
执行新功能、快速拓展开发团队
二.Web分层设计步骤 1.分层策略
2.确定需要层
3.决定如何分发各层和组件
4.确定是否需要折叠层
5.确定层之间引用的规则 下图是一个示例:该web架构示例是使用了 cqrs 模式,涉及到了事件源es, 事件源实现本因该分离到命令域和查询域, 而项目中应用服务层直接引用了底层数据访问层Dapper(绕过了领域层), 这样底层Dapper接口方法的修改或换成EF将影响顶层应用服务层,这属于第三种"松散的互动"。 应该推荐使用第一种自上而下的交互。
6.确定跨领域问题
7.定义层之间的接口 (1)抽象接口 //表现层调用应用服务层ApplicationService private readonly ICustomerAppService _customerAppService; public CustomerController(ICustomerAppService customerAppService, INotificationHandler<DomainNotification> notifications) : base(notifications) { _customerAppService = customerAppService; } 但在项目中,为了简化开发量,表现层调用应用服务层的实现类(违反了面向接口编程)。表现层在CustomerController控制器中如下所示: //调用应用服务层ApplicationService private readonly CustomerAppService _customerAppService = null; //日志对象 public readonly ILoggerEX _logger; public CustomerController(INotificationHandler<DomainNotification> notifications, ILoggerEX logger, CustomerAppService customerAppService) : base(notifications) { _customerAppService = customerAppService; _logger = logger; } (2)依赖倒置 这是一种编程风格,是面向接口编程的实现,依赖倒置的应用如:DDD\CQRS, 层依赖于层接口,而不是层依赖于另一个层的实现。依赖注入模式是依赖性反转的常见实现。依赖性反转方法提供了灵活性,可以帮助实现可插入设计,因为依赖性是通过配置而不是代码组成的。它还可以最大化可测试性,因为您可以轻松地将具体测试类注入到设计的不同层中。 依赖性是通过配置的,如下代码所示,由CommandRepository类来实现ICommandRepository接口: services.AddScoped<ICommandRepository<CommandModels.Customer>, CommandRepository<CommandModels.Customer>>();
services.AddScoped<IQueryRepository<QueryModels.Customer>, QueryRepository<QueryModels.Customer>>();
(3) 基于消息 可以使用基于消息的通信来实现接口并提供层之间的交互,.net技术如:wcf, web services, msmq它们支持跨物理和进程边界的交互(以xml的soap格式传输),但这是对于09年流行的web架构。现在基于消息多数用web api技术,是面向微服务开发(以json的rest api)。
参考资料
Comments
0
|