asp.net core系列 71 Web架构分层指南

  • 时间:
  • 浏览:1
  • 来源:大发快三_快三全天计划_大发快三全天计划

一.概述

  本章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.分层策略

    (1)分层粒度是选泽分层策略的关键第一步.

    (2)在逻辑分层中, 多层是在同一系统多多线程 中运行,这还还要利用更高性能的通信机制。这类通过组件接口直接调用。还要小心保持层之间的封装和松散耦合。

    (3)在物理分层中,选泽为宜的通信机制,该机制考虑到通信延迟并保持之间的松散耦合。

    (4)多层中,考虑它们之间如保相互影响,将确保性能和灵活性之间的良好平衡。

  2.选泽还要层

    最常用的最好的措施是将表现层,服务层,业务层和数据访问层功能分离到单独的层中。许多应用系统多多线程 还引入了各种组件像缓存、日志、消息队列等。

  3.决定如保埋点各层和组件

    对于web体系架构,一般就有在有一俩个 物理层,不都还能否 在必要时,才应在不同的物理层上分布层和组件。这是实现分布式部署的常见原因分析包括安全策略,物理约束,共享业务逻辑和可伸缩性。

  4.选泽否是还要折叠层

    一般规则是您应始终将功能分组到层中。在许多清况 下,有一俩个 层还还要充当代理或传递层,提供封装和松散耦合,而不提供一定量功能。之前 ,通过分离该功能,您还还要稍后对其进行扩展,而对设计中的许多层几乎没有影响,如:应用服务层。

  5.选泽层之间引用的规则

    在分层策略时,您还要定义层如保相互交互的规则(交互是指:各层引用的关系)。指定交互规则的主要原因分析是最小化依赖性并消除循环引用。之前 应该遵循以下最好的措施之一:

    (1)自上而下的交互

      较高级别的层还还要与下面的层交互,之前 较低级别的层不应该与后边的层交互。此规则将帮助您处置层之间的循环依赖关系,以及要降低层之间的依赖性。

    (2)严格的互动

      每个层还要仅与下面的层进行交互。此规则将强制严格分离关注点,其中每个层仅知道下面的层。此规则的好处是对层界面的修改只会影响后边的层。不可能 您正在设计有一俩个 将随着时间的推移进行修改以引入新功能之前 您希望最大限度地减少那些更改的影响的应用系统多多线程 ,不可能 您正在设计不可能 分布在不同物理层上的应用系统多多线程 ,请考虑使用此最好的措施。

    (3)松散的互动

      较高级别的层还还要绕过层直接与较低级别的层交互。这还还要提高性能,但也会增加依赖性换句话说,对较低级别层的修改还还要影响后边的多个层

    下图是有一俩个 示例:该web架构示例是使用了 cqrs 模式,涉及到了事件源es, 事件源实现本因该分离到命令域和查询域, 而项目中应用服务层直接引用了底层数据访问层Dapper(绕过了领域层),  原本底层Dapper接口最好的措施的修改或添加EF将影响顶层应用服务层,这属于第五种生活"松散的互动"。 应该推荐使用第五种生活自上而下的交互。

  6.选泽跨领域问提

    定义层后,还要标识跨越层的功能。此功能通常被描述为横切关注点,包括日志记录,缓存,验证,身份验证和异常管理。选泽应用系统多多线程 中的每个横切关注点非常重要,并设计单独的组件以尽不可能 地管理那些问提。此最好的措施可帮助您实现更好的可重用性和可维护性。

    如下图所示:NLog与Redis是具体实现组件,实现了Common层中的日志和缓存接口,Common层就是横切组件,是跨层可重用的。像Ioc也是横切组件。 下图层的名称没有标识跨越层的功能,不可能 是GFNetCore.Infra.CrossCutting.IoC 原本命名会更好。

  7.定义层之间的接口

    为层定义接口时,主要目标是强制层之间的松散耦合。这原因分析分析层不应暴露另一层不可能 依赖的实物细节。相反,层的接口应设计为通过提供隐藏层内组件细节的公共接口来最小化依赖性。你是什么隐藏称为抽象,有许多不同的最好的措施来实现它。以下设计最好的措施可用于定义层的接口:

    (1)抽象接口

      通过定义抽象基类或接口类来实现,该类充当具体类的类型定义。该类型定义了有一俩个 公共接口,该层的所有使用者都使用该接口与该层进行交互。这是五种生活面向接口编程,这类:表现层调用应用服务层的接口。表现层在CustomerController控制器中如下所示(通过依赖注入后,构造最好的措施来实例):

     //表现层调用应用服务层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)。

 参考资料

   分层应用系统多多线程 指南 

猜你喜欢

TechWeb.com.cn

针对《消息称ofo已还清蚂蚁金服欠款能涅槃重生么?》的文章,接近ofo方面的消息人士表示,阿里系目前仍是ofo的最大债主。【TechWeb】10月14日消息,深交所上市公司江西

2019-10-14

【创见移动硬盘报价】最新创见移动硬盘报价大全

关于亲戚亲戚大家|广告服务|使用条款|联系亲戚亲戚大家北京盛拓优讯信息技术有限公司.版权所有中华人民共和国增值电信业务经营许可证编号:京B2-20170206北京市公安局海淀分

2019-10-14

D. Meadowcroft数据,D. Meadowcroft新闻,D. Meadowcroft视频,D. Meadowcroft身价

首页新闻视频直播数据APP懂球号广告合作协议协议D.MeadowcroftD.Meadowcroft俱乐部:维克诺域治国籍:英格兰身高:193CM位置:后卫年龄:34岁体重:7

2019-10-14

买谁家的?三星发布Galaxy C5/C7 同OPPO R9部分用户重合

昨天晚上,三星在北京召开发布会,正式发布了中国特供的GalaxyC系列。买谁家的?三星发布GalaxyC5/C7同OPPOR9帕累托图用户重合配置方面,GalaxyC5采用骁龙

2019-10-14

一位農業女勞模的花生情緣

圖:全國農業勞動模範、保定市易園生態農業科技開發有限公司創始人蔣曉霞4005年,離開農村20年後,年屆四旬的易水「鐵姑娘」蔣曉霞,把經營了15年的汽車配件維修廠轉手,要回農村種

2019-10-14