DDD/CQRS模式,微服务,容器

DDD/CQRS模式,微服务,容器

https://docs.microsoft.com/zh-cn/previous-versions/msp-n-p/ee658109(v=pandp.10)

Web架构分层指南

一.概述

  本章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并结合应用了DDDCQRS分层模式,以及系统各种中间件。

  

  下图是一个订单微服务站点,包含了简化的cqrs分层,蓝色长方格是表示cqrs分层的职责,包括了查询 Queries viewModels和命令Command Domain-Model以及上层的应用服务层Application,如下所示

  1.1 逻辑分层设计架构类型

    (1) 最传统的分层是经典三层设计,包括表现层,业务层,数据层.

    (2) 基于服务的解决方案SOA,公开应用程序业务功能的服务层,服务层在业务层之上。

    (3) 基于领域驱动设计的DDDCQRS分层模式

    (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)依赖倒置

      这是一种编程风格,是面向接口编程的实现,依赖倒置的应用如:DDDCQRS, 层依赖于层接口,而不是层依赖于另一个层的实现。依赖注入模式是依赖性反转的常见实现。依赖性反转方法提供了灵活性,可以帮助实现可插入设计,因为依赖性是通过配置而不是代码组成的。它还可以最大化可测试性,因为您可以轻松地将具体测试类注入到设计的不同层中。

      依赖性是通过配置的,如下代码所示,由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)。

asp.net core系列篇

asp.net core系列 73 Exceptionless+Nlog以及Apollo介绍
摘要:一. 介绍 在一上篇中介绍了Exceptionless的基本使用,这篇主要讲Exceptionless结合Nlog的实现双重日志记录,包括Exceptionles的UI可视化日志以及Nlog的txt文件日志。再是从Apollo配置中心读取配置文件,当系统越庞大越多时,需要配置的参数也越来越多,可以通 阅读全文

posted @ 2019-09-24 19:57 花阴偷移 阅读 (344) | 评论 (0) 编辑

asp.net core系列 72 Exceptionless使用介绍
摘要:一.Exceptionless介绍 Exceptionless专注于.net平台提供实时错误和日志报告。主要包括:错误通知、智能分组异常、详细错误报告堆栈跟踪、支持离线、UI查看重要错误和确定优先级、仪表板上的统计信息和趋势、对异常标记为已修复,监视回归、将事件标记为关键等。 1.1 服务端托管 对 阅读全文

posted @ 2019-09-07 16:46 花阴偷移 阅读 (478) | 评论 (0) 编辑

asp.net core系列 71 Web架构分层指南
摘要:一.概述 本章Web架构分层指南,参考了“Microsoft应用程序体系结构指南”(该书是在2009年出版的,当时出版是为了帮助开发人员和架构师更快速,更低风险地使用Microsoft平台和.NET Framework设计和构建有效,高质量的应用程序)。虽然已过去十年了,技术架构已更新(如流行的DD 阅读全文

posted @ 2019-08-23 09:32 花阴偷移 阅读 (1292) | 评论 (6) 编辑

asp.net core系列 70 即时通迅-WebSocket+Redis发布订阅
摘要:一.概述 在asp.net core 中可以用WebSocket 或asp.net core SignalR来开发即时通迅。在项目中由于开发前后端分离,对于SignalR前端技术人员不想依赖juqery和SignalR.js包,后端确定使用WebSocket 来实现。对于asp.net core有自 阅读全文

posted @ 2019-08-09 09:33 花阴偷移 阅读 (1175) | 评论 (2) 编辑

asp.net core系列 69 Amazon S3 资源文件上传示例
摘要:一. 上传示例 Amazon Simple Storage Service 是互联网存储解决方案。该服务旨在降低开发人员进行网络规模级计算的难度。 Amazon S3 提供了一个简单 Web 服务接口,可用于随时在 Web 上的任何位置存储和检索任何数量的数据。此服务让所有开发人员都能访问同一个具备 阅读全文

posted @ 2019-08-08 20:04 花阴偷移 阅读 (346) | 评论 (0) 编辑

asp.net core系列 68 Filter管道过滤器
摘要:一.概述 本篇详细了解一下asp.net core filters,filter叫"筛选器"也叫"过滤器",是请求处理管道中的特定阶段之前或之后运行代码。filter用于处理横切关注点。 横切关注点的示例包括:错误处理、缓存、配置、授权和日志记录。 filter可以避免重复代码,通过Attribut 阅读全文

posted @ 2019-07-16 09:37 花阴偷移 阅读 (608) | 评论 (5) 编辑

asp.net core系列 67 Web压力测试工具WCAT
摘要:一.介绍 最近搭建了一套CQRS框架,需要在投入开发前,进行必要的压力测试。Web Capacity Analysis Tool (Wcat)是一种轻量级HTTP负载生成工具,主要用于衡量受控环境中Web服务器的性能。WCAT可以模拟数千个并发用户向单个网站或多个网站发出请求。WCAT引擎使用一个简 阅读全文

posted @ 2019-07-11 12:34 花阴偷移 阅读 (660) | 评论 (3) 编辑

asp.net core系列 66 Dapper介绍--Micro-ORM
摘要:一.概述 目前对于.net的数据访问ORM工具很多,EF和EF Core是一个重量级的框架。最近在搭建新的项目架构,来学习一下轻量级的数据访问ORM工具Dapper。Dapper支持SQL Server,MySQL,Sqlite,SqlCE,Firebird等的高性能Micro-ORM(微ORM框架 阅读全文

posted @ 2019-06-29 14:27 花阴偷移 阅读 (928) | 评论 (0) 编辑

asp.net core系列 65 正反案例介绍SOLID原则
摘要:一.概述 SOLID五大原则使我们能够管理解决大多数软件设计问题。由Robert C. Martin在20世纪90年代编写了这些原则。这些原则为我们提供了从紧耦合的代码和少量封装转变为适当松耦合和封装业务实际需求的结果方法。使用这些原则,我们可以构建一个具有整洁,可读且易于维护的代码应用程序。 SO 阅读全文

posted @ 2019-05-24 09:43 花阴偷移 阅读 (519) | 评论 (1) 编辑

asp.net core系列 64 结合eShopOnWeb全面认识领域模型架构
摘要:一.项目分析 在上篇中介绍了什么是"干净架构",DDD符合了这种干净架构的特点,重点描述了DDD架构遵循的依赖倒置原则,使软件达到了低藕合。eShopOnWeb项目是学习DDD领域模型架构的一个很好案例,本篇继续分析该项目各层的职责功能,主要掌握ApplicationCore领域层内部的术语、成员职 阅读全文

posted @ 2019-05-16 11:12 花阴偷移 阅读 (1011) | 评论 (5) 编辑

asp.net core系列 63 领域模型架构 eShopOnWeb项目分析 上
摘要:一.概述 本篇继续探讨web应用架构,讲基于DDD风格下最初的领域模型架构,不同于DDD风格下CQRS架构,二者架构主要区别是领域层的变化。 架构的演变是从领域模型到CQRS, 一开始DDD是用领域模型的分层架构,用单一的领域模型处理业务逻辑的所有方法,特别是命令和查询,这可能导致复杂性直线上升,C 阅读全文

posted @ 2019-05-13 13:45 花阴偷移 阅读 (1097) | 评论 (1) 编辑

asp.net core系列 62 CQRS架构下Equinox开源项目分析
摘要:一.DDD分层架构介绍 本篇分析CQRS架构下的Equinox开源项目。该项目在github上star占有2.4k。便决定分析Equinox项目来学习下CQRS架构。再讲CQRS架构时,先简述下DDD风格,在DDD分层架构中,一般包含表现层、应用程序层(应用服务层)、领域层(领域服务层)、基础设施层 阅读全文

posted @ 2019-05-07 11:09 花阴偷移 阅读 (2196) | 评论 (23) 编辑

asp.net core系列 61 Ocelot 构建服务发现简单示例
摘要:一.概述 Ocelot允许指定服务发现提供程序,如Consul或Eureka。 这二个中间件是用来实现:服务治理或秒服务发现,服务发现查找Ocelot正在转发请求的下游服务的主机和端口。目前Ocelot仅在GlobalConfiguration部分支持配置服务发现功能,这意味着相同的服务发现提供程序 阅读全文

posted @ 2019-04-28 16:31 花阴偷移 阅读 (566) | 评论 (2) 编辑

asp.net core系列 60 Ocelot 构建服务认证示例
摘要:一.概述 在Ocelot中,为了保护下游api资源,用户访问时需要进行认证鉴权,这需要在Ocelot 网关中添加认证服务。添加认证后,ReRoutes路由会进行身份验证,并使用Ocelot的基于声明的功能。在Startup.cs中注册认证服务,为每个注册提供一个方案 (authenticationP 阅读全文

posted @ 2019-04-25 15:06 花阴偷移 阅读 (529) | 评论 (0) 编辑

asp.net core系列 59 Ocelot 构建基础项目示例
摘要:一.入门概述 从这篇开始探讨Ocelot,Ocelot是一个.NET API网关,仅适用于.NET Core,用于.NET面向微服务/服务的架构中。当客户端(web站点、ios、 app 等)访问web api时,需要先统一入口点进入Ocelot网关(Ocelot可以做很多事情例如路由,身份验证,服 阅读全文

posted @ 2019-04-23 14:55 花阴偷移 阅读 (738) | 评论 (5) 编辑

asp.net core系列 58 IS4 基于浏览器的JavaScript客户端应用程序
摘要:一. 概述 本篇探讨使用"基于浏览器的JavaScript客户端应用程序"。与上篇实现功能一样,只不过这篇使用JavaScript作为客户端程序,而非core mvc的后台代码HttpClient实现。 功能一样:用户首先要登录IdentityServer站点,再使用IdentityServer发出 阅读全文

posted @ 2019-04-19 14:17 花阴偷移 阅读 (527) | 评论 (3) 编辑

asp.net core系列 57 IS4 使用混合流(OIDC+OAuth2.0)添加API访问
摘要:一.概述 在上篇中,探讨了交互式用户身份验证,使用的是OIDC协议。 在之前篇中对API访问使用的是OAuth2.0协议。这篇把这两个部分放在一起,OpenID Connect和OAuth 2.0组合的优点在于:可以使用单个协议和令牌服务,进行单次交换来实现这两者。 上篇中使用了OpenID Con 阅读全文

posted @ 2019-04-18 14:49 花阴偷移 阅读 (495) | 评论 (0) 编辑

asp.net core系列 56 IS4使用OpenID Connect添加用户认证
摘要:一.概述 在前二篇中讲到了客户端授权的二种方式: GrantTypes.ClientCredentials凭据授权和GrantTypes.ResourceOwnerPassword密码授权,都是OAuth2.0协议。本篇使用OpenID Connect添加用户认证,客户端授权是GrantTypes. 阅读全文

posted @ 2019-04-17 14:53 花阴偷移 阅读 (453) | 评论 (0) 编辑

asp.net core系列 55 IS4使用Identity密码保护API
摘要:一.概述 OAuth 2.0资源(web api)所有者密码授权,允许客户端(Client项目)向令牌服务(IdentityServer项目)发送用户名和密码,并获取代表该用户的访问令牌。在官方文档中讲到:规范通常建议不要使用“资源所有者密码授权”。当用户进行身份验证并请求访问令牌时,使用一个交互式 阅读全文

posted @ 2019-04-15 10:25 花阴偷移 阅读 (510) | 评论 (3) 编辑

asp.net core系列 54 IS4用客户端凭据保护API
摘要:一. 概述 本篇开始进入IS4实战学习,从第一个示例开始,该示例是 “使用客户端凭据保护API”,这是使用IdentityServer保护api的最基本场景。该示例涉及到三个项目包括:IdentityServer项目、API项目、Client项目,都有自己的宿主,为了方便开发,放在了一个解决方案下( 阅读全文

posted @ 2019-04-12 09:22 花阴偷移 阅读 (636) | 评论 (5) 编辑

asp.net core系列 53 IdentityServer4 (IS4)介绍
摘要:一.概述 在物理层之间相互通信必须保护资源,需要实现身份验证和授权,通常针对同一个用户存储。对于资源安全设计包括二个部分,一个是认证,一个是API访问。 1 认证 认证是指:应用程序需要知道当前用户的身份时,需要进行身份验证,确定用户是否有效。最常见的身份验证协议是SAML2p,WS-Federat 阅读全文

posted @ 2019-04-11 09:05 花阴偷移 阅读 (722) | 评论 (1) 编辑

asp.net core系列 52 Identity 其它关注点
摘要:一.登录分析 在使用identity身份验证登录时,在login中调用的方法是: 跟踪查看源码,源码下载https://github.com/aspnet/AspNetCore/releases 这里有core源码的不同版本,在vs 2017下只能加载2.2及以下的版本。 下面是登录的大概步骤: ( 阅读全文

posted @ 2019-04-10 09:58 花阴偷移 阅读 (252) | 评论 (0) 编辑

asp.net core系列 51 Identity 授权(下)
摘要:1.6 基于资源的授权 前面二篇中,熟悉了五种授权方式(对于上篇讲的策略授权,还有IAuthorizationPolicyProvider的自定义授权策略提供程序没有讲,后面再补充)。本篇讲的授权方式不是一种全新的授权方式,而是授权应用场景的灵活控制。 基于资源的授权是控制在 razor pages 阅读全文

posted @ 2019-04-09 12:03 花阴偷移 阅读 (562) | 评论 (5) 编辑

asp.net core系列 50 Identity 授权(中)
摘要:1.5 基于策略的授权 在上篇中,已经讲到了授权访问(authorization)的四种方式。其中Razor Pages授权约定和简单授权二种方式更像是身份认证(authentication) ,因为只要是合法用户登录就能访问资源。 而角色授权和声明授权二种方式是真正的授权访问(authorizat 阅读全文

posted @ 2019-04-08 10:42 花阴偷移 阅读 (719) | 评论 (1) 编辑

asp.net core系列 49 Identity 授权(上)
摘要:一.概述 授权是指用户能够访问资源的权限,如页面数据的查看、编辑、新增、删除、导出、下载等权限。ASP.NET Core 授权提供了多种且灵活的方式,包括:Razor pages授权约定、简单授权、Role角色授权、Claim声明授权、Policy策略授权、资源授权、视图授权。 1.1 Razor 阅读全文

posted @ 2019-04-03 11:44 花阴偷移 阅读 (732) | 评论 (1) 编辑

asp.net core系列 48 Identity 身份模型自定义
摘要:一.概述 ASP.NET Core Identity提供了一个框架,用于管理和存储在 ASP.NET Core 应用中的用户帐户。 Identity添加到项目时单个用户帐户选择作为身份验证机制。 默认情况下,Identity可以使用的 Entity Framework (EF) Core 数据模型。 阅读全文

posted @ 2019-03-25 15:51 花阴偷移 阅读 (893) | 评论 (1) 编辑

asp.net core系列 47 Identity 自定义用户数据
摘要:一.概述 接着上篇的WebAppIdentityDemo项目,将自定义用户数据添加到Identity DB,自定义扩展的用户数据类应继承IdentityUser类, 文件名为Areas / Identity / Data / {项目名称}User.cs。自定义的用户数据模型属性需要使用[Person 阅读全文

posted @ 2019-03-22 16:24 花阴偷移 阅读 (881) | 评论 (0) 编辑

asp.net core系列 46 Identity介绍
摘要:一. Identity 介绍 ASP.NET Core Identity是一个会员系统,可为ASP.NET Core应用程序添加登录功能。可以使用SQL Server数据库配置身份以存储用户名,密码和配置文件数据。或者,可以使用另一个持久性存储,例如,Azure表存储。下面学习如何使用Identit 阅读全文

posted @ 2019-03-21 17:00 花阴偷移 阅读 (1075) | 评论 (0) 编辑

asp.net core系列 45 Web应用 模型绑定和验证
摘要:一. 模型绑定 ASP.NET Core MVC 中的模型绑定,是将 HTTP 请求中的数据映射到action方法参数。 这些参数可能是简单类型的参数,如字符串、整数或浮点数,也可能是复杂类型的参数。 当 MVC 收到 HTTP 请求时,它会将此请求路由定位到控制器的指定action方法。默认路由模 阅读全文

posted @ 2019-03-20 10:43 花阴偷移 阅读 (542) | 评论 (0) 编辑

asp.net core系列 44 Web应用 布局
摘要:一.概述 MVC的视图与Razor页面经常共享视觉和程序元素,通过使用布局来完成,布局还可减少重复代码。本章演示了以下内容的操作方法:(1)使用通用布局,(2)自定义布局,(3) 共享指令,(4)在呈现Razor页面或MVC视图之前运行通用代码。 大多数 Web 应用都有一个通用布局,可在页面间切换 阅读全文

posted @ 2019-03-19 09:05 花阴偷移 阅读 (667) | 评论 (0) 编辑

asp.net core系列 43 Web应用 Session分布式存储(in memory与Redis)
摘要:一.概述 HTTP 是无状态的协议。 默认情况下,HTTP 请求是不保留用户值或应用状态的独立消息。 本文介绍了几种保留请求间用户数据和应用状态的方法。下面以表格形式列出这些存储方式,本篇专讲Session会话状态,计划下篇再讲应用状态。 存储方法 存储机制 依赖关系注入 服务器端应用代码 1.1 阅读全文

posted @ 2019-03-18 09:43 花阴偷移 阅读 (741) | 评论 (3) 编辑

asp.net core系列 42 Web 应用 分部视图
摘要:一.分部视图 对于MVC 视图和 Razor Pages 页面,都有分部视图功能。通常将 MVC 视图和 Razor Pages 页面统称为“标记文件”,下面会常提到该名词。使用分部视图的优势包括:(1) 将大型标记文件分解为更小的组件。(2) 减少跨标记文件中,常见标记内容的重复。 建议:(1)不 阅读全文

posted @ 2019-03-14 10:35 花阴偷移 阅读 (520) | 评论 (1) 编辑

asp.net core系列 41 Web 应用 MVC视图
摘要:一.MVC视图 在Web开发的MVC和Razor中,都有使用视图,在Razor中称为"页"。.cshtml视图是嵌入了Razor标记的HTML模板。 Razor 标记使用C#代码,用于与HTML 标记交互以生成发送给客户端的网页。在MVC目录结构中,Views / [ControllerName] 阅读全文

posted @ 2019-03-13 11:56 花阴偷移 阅读 (467) | 评论 (0) 编辑

asp.net core系列 40 Web 应用MVC 介绍与详细示例
摘要:一. MVC介绍 MVC架构模式有助于实现关注点分离。视图和控制器均依赖于模型。 但是,模型既不依赖于视图,也不依赖于控制器。 这是分离的一个关键优势。 这种分离允许模型独立于可视化展示进行构建和测试。ASP.NET Core MVC 包括以下功能: 路由、模型绑定、模型验证、依赖关系注入、筛选器、 阅读全文

posted @ 2019-03-11 14:56 花阴偷移 阅读 (771) | 评论 (0) 编辑

asp.net core系列 39 Web 应用Razor 介绍与详细示例
摘要:一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor。 这样开发Web包括了MVC框架和Razor框架。对于Razor来说它是一个新特性,在官方介绍ASP.NET Core的优点中提到“Razor Pages可以使基于页面 阅读全文

posted @ 2019-03-08 10:17 花阴偷移 阅读 (379) | 评论 (0) 编辑

asp.net core系列 38 WebAPI 返回类型与响应格式--必备
摘要:一.返回类型 ASP.NET Core 提供以下 Web API Action方法返回类型选项,以及说明每种返回类型的最佳适用情况: (1) 固定类型 (2) IActionResult (3) ActionResult<T> 1.1 固定类型 最简单的操作是返回基元或复杂数据类型(如 string 阅读全文

posted @ 2019-03-06 11:59 花阴偷移 阅读 (1232) | 评论 (0) 编辑

asp.net core系列 37 WebAPI 使用OpenAPI (swagger)中间件
摘要:一.概述 在使用Web API时,对于开发人员来说,了解其各种方法可能是一项挑战。在ASP.NET Core上,Web api 辅助工具介绍二个中间件,包括:Swashbuckle和NSwag .NET。本篇先讲Swashbuckle。二者都使用Swagger规范,Swagger也称为OpenAPI 阅读全文

posted @ 2019-03-05 11:24 花阴偷移 阅读 (849) | 评论 (0) 编辑

asp.net core系列 36 WebAPI 搭建详细示例
摘要:一.概述 HTTP不仅仅用于提供网页。HTTP也是构建公开服务和数据的API强大平台。HTTP简单灵活且无处不在。几乎任何你能想到的平台都有一个HTTP库,因此HTTP服务可以覆盖广泛的客户端,包括浏览器,移动设备和传统的桌面应用程序。 ASP.NET Web API 是一个框架,基于.NET Fr 阅读全文

posted @ 2019-03-04 11:47 花阴偷移 阅读 (1695) | 评论 (0) 编辑

asp.net core系列 35 EF保存数据(2) -- EF系列结束
摘要:一.事务 (1) 事务接着上篇继续讲完。如果使用了多种数据访问技术,来访问关系型数据库,则可能希望在这些不同技术所执行的操作之间共享事务。下面示例显示了如何在同一事务中执行 ADO.NET SqlClient 操作和 Entity Framework Core 操作。 (2) 使用 System.T 阅读全文

posted @ 2019-03-01 11:54 花阴偷移 阅读 (597) | 评论 (0) 编辑

asp.net core系列 34 EF保存数据(1)
摘要:一. 基本数据 每个EF上下文实例都有一个 ChangeTracker(更改跟踪器),它负责跟踪需要写入数据库的更改。 当更改实体类的实例时(修改属性,删除实例,新建实例等),这些更改会记录在 ChangeTracker 中,然后在调用 SaveChanges 时被写入数据库。 此数据库提供程序负责 阅读全文

posted @ 2019-02-28 16:00 花阴偷移 阅读 (630) | 评论 (0) 编辑

asp.net core系列 33 EF查询数据 (2)
摘要:一. 原生SQL查询 接着上篇讲。通过 Entity Framework Core 可以在使用关系数据库时下降到原始 SQL 查询。 在无法使用 LINQ 表达要执行的查询时,或因使用 LINQ 查询而导致低效的 SQL 查询时非常有用。 原始 SQL 查询可返回实体类型,或者从 EF Core 2 阅读全文

posted @ 2019-02-27 16:09 花阴偷移 阅读 (507) | 评论 (2) 编辑

asp.net core系列 32 EF查询数据 必备知识(1)
摘要:一.查询的工作原理 Entity Framework Core 使用语言集成查询 (LINQ) 来查询数据库中的数据。 通过 LINQ 可使用 C#(或你选择的其他 .NET 语言)基于派生上下文和实体类编写强类型查询。 LINQ 查询的表示形式会传递给数据库提供程序,进而转换为特定的数据库查询语言 阅读全文

posted @ 2019-02-26 16:22 花阴偷移 阅读 (923) | 评论 (3) 编辑

asp.net core系列 31 EF管理数据库架构--必备知识 反向工程
摘要:一. 反向工程 反向工程是基于数据库架构,生成的实体类和DbContext类代码的过程,对于Visual Studio开发,建议使用PMC。对于其他开发环境,请选择.NET Core CLI工具(跨平台)。 (1) 在程序包管理器控制台(PMC)工具中使用命令Scaffold-DbContext 来 阅读全文

posted @ 2019-02-25 13:57 花阴偷移 阅读 (824) | 评论 (1) 编辑

asp.net core系列 30 EF管理数据库架构--必备知识 迁移
摘要:一.管理数据库架构概述 EF Core 提供两种主要方法来保持 EF Core 模型和数据库架构同步。一是以 EF Core 模型为基准,二是以数据库为基准。 (1)如果希望以 EF Core 模型为准,请使用迁移。 对 EF Core 模型进行更改时,此方法会以增量方式将相应架构更改应用到数据库, 阅读全文

posted @ 2019-02-22 16:19 花阴偷移 阅读 (739) | 评论 (2) 编辑

asp.net core系列 29 EF模型配置(查询类型,关系数据库建模)
摘要:一.查询类型 此功能是EF Core 2.1中的新功能。 EF Core除了实体类型之外,EF Core模型还可以包含查询类型,这些查询类型是针对“未映射到实体类型”的数据获取。比如视图,或只读数据表。 1.1 下面介绍下,查询类型与实体类型共同与不同点: (1) 可以在OnModelCreatin 阅读全文

posted @ 2019-02-21 17:39 花阴偷移 阅读 (573) | 评论 (2) 编辑

asp.net core系列 28 EF模型配置(字段,构造函数,拥有实体类型)
摘要:一. 支持字段 EF允许读取或写入字段而不是一个属性。在使用实体类时,用面向对象的封装来限制或增强应用程序代码对数据访问的语义时,这可能很有用。无法使用数据注释配置。除了约定,还可以使用Fluent API为属性配置支持字段。 1.1 约定 1.2 Fluent API 二. 构造函数 从开始 EF 阅读全文

posted @ 2019-02-20 17:47 花阴偷移 阅读 (599) | 评论 (2) 编辑

asp.net core系列 27 EF模型配置(索引,备用键,继承)
摘要:一.索引 索引是许多数据存储中的常见概念。虽然它们在数据存储中的实现可能会有所不同,但它们可用于更有效地基于列(或列集)进行查找。按照约定,用作外键每个属性 (或组的属性) 会自动创建索引。无法使用数据注释创建索引。 1.1 非唯一索引 Fluent API 在单个属性上指定索引。默认情况下,索引是 阅读全文

posted @ 2019-02-19 12:29 花阴偷移 阅读 (534) | 评论 (0) 编辑

asp.net core系列 26 EF模型配置(实体关系)
摘要:一.概述 EF实体关系定义了两个实体互相关联起来(主体实体和依赖实体的关系,对应数据库中主表和子表关系)。 在关系型数据库中,这种表示是通过外键约束来体现。本篇主要讲一对多的关系。先了解下描述关系的术语。 (1) 依赖实体: 这是包含外键属性的实体(子表)。有时称为 child 。 (2) 主体实体 阅读全文

posted @ 2019-02-18 15:18 花阴偷移 阅读 (603) | 评论 (0) 编辑

asp.net core系列 25 EF模型配置(隐藏属性)
摘要:一. 隐藏属性概述 隐藏属性也叫影子属性,该属性不是在.net实体类中定义的属性,而是在EFCore模型中为该实体类型定义的属性。这些属性的值和状态完全在变更跟踪器中维护。它有二个功能:(1)当数据库中某些字段不想映射到实体类上公开的属性时,隐藏属性非常有用。(2)隐藏属性通常是用于外键属性,其中两 阅读全文

posted @ 2019-02-17 11:19 花阴偷移 阅读 (441) | 评论 (0) 编辑

asp.net core系列 24 EF模型配置(主键,生成值,最大长度,并发标记)
摘要:一.主键 键用作每个实体实例的主要唯一标识符。 使用关系数据库时,这会映射到主键的概念。 还可以配置不是主键的唯一标识符。按照约定,名为 Id 或 <type name>Id 的属性会配置为实体的键。例如下面二个示例: 除了上面讲到的约定,还可以用数据注释将单个属性配置为实体的键,下面示例使用数据注 阅读全文

posted @ 2019-02-16 09:49 花阴偷移 阅读 (623) | 评论 (0) 编辑

asp.net core系列 23 EF模型配置(概述, 类型和属性的包含与排除)
摘要:一.模型配置概述 EF使用一组约定基于实体类的定义来构建模型。 可指定其他配置以补充或替代约定的内容。本系列介绍的配置可应用于面向任何数据存储的模型,以及面向任意关系数据库时可应用的配置。 数据库提供程序还可支持特定于具体数据存储的配置,如Microsoft.EntityFrameworkCore. 阅读全文

posted @ 2019-02-15 09:25 花阴偷移 阅读 (559) | 评论 (0) 编辑

asp.net core 系列 22 EF(连接字符串,连接复原,DbContext)
摘要:一.连接字符串 在上二篇中,ASP.NET Core 应用程序连接字符串是写死在ConfigureServices代码中,下面介绍通过配置来实现。连接字符串可以存储在 appsettings.json、用户机密存储、其他配置源中。 下面示例演示appsettings.json 中存储的连接字符串,这 阅读全文

posted @ 2019-02-14 09:47 花阴偷移 阅读 (1739) | 评论 (0) 编辑

asp.net core 系列 21 EF现有数据库进行反向工程
摘要:一.概述 在上篇中使用EF基于数据模型创建数据库, 本篇继续使用 EF 基于数据库创建数据模型。 实现对已有数据库进行反向工程,来构建数据访问的 ASP.NET Core MVC 应用程序。已有数据库使用上篇的EFGetStarted.AspNetCore.NewDb库。这里还是使用Visual S 阅读全文

posted @ 2019-02-13 09:32 花阴偷移 阅读 (860) | 评论 (0) 编辑

asp.net core 系列 20 EF基于数据模型创建数据库
摘要:一.概述 本章使用 Entity Framework Core 构建执行基本数据访问的 ASP.NET Core MVC 应用程序。使用迁移(migrations)基于数据模型创建数据库,是一种code first模式。可以在Windows 上使用 Visual Studio 2017,或在 Win 阅读全文

posted @ 2019-02-12 09:43 花阴偷移 阅读 (1112) | 评论 (3) 编辑

asp.net core 系列 19 EFCore介绍
摘要:一.概述 目前最新的EF Core版本是3.0,最稳定的EF Core版本是2.2。EF Core 的计划与 .NET Core以及 ASP.NET Core 版本同步。EF Core 是一个 .NET Standard库,使用 EF Core 开发面向 .NET Core 的应用。生成 .NET 阅读全文

posted @ 2019-01-30 09:42 花阴偷移 阅读 (1056) | 评论 (1) 编辑

asp.net core 系列 18 web服务器实现
摘要:一. ASP.NET Core Module 在介绍ASP.NET Core Web实现之前,先来了解下ASP.NET Core Module。该模块是插入 IIS 管道的本机 IIS 模块(本机是指程序所部署的服务器)。是基于windows平台处理 IIS和进程内IISHttpServer或Kes 阅读全文

posted @ 2019-01-29 09:17 花阴偷移 阅读 (1515) | 评论 (2) 编辑

asp.net core 系列 17 通用主机 IHostBuilder
摘要:一.概述 ASP.NET Core 通用主机 (HostBuilder),该主机对于托管不处理 HTTP 请求的应用非常有用。通用主机的目标是将 HTTP 管道从 Web 主机 API 中分离出来,从而启用更多的主机方案。 基于通用主机的消息、后台任务和其他非 HTTP 工作负载可从横切功能(如配置 阅读全文

posted @ 2019-01-28 09:13 花阴偷移 阅读 (1070) | 评论 (0) 编辑

asp.net core 系列 16 Web主机 IWebHostBuilder
摘要:一.概述 在asp.net core中,Host主机负责应用程序启动和生存期管理。host主机包括Web 主机(IWebHostBuilder)和通用主机(IHostBuilder)。Web 主机是适用于托管 Web 应用;通用主机(ASP.NET Core 2.1 或更高版本)是适用于托管非 We 阅读全文

posted @ 2019-01-25 11:06 花阴偷移 阅读 (1175) | 评论 (2) 编辑

asp.net core 系列 15 中间件
摘要:一.概述 中间件(也叫中间件组件)是一种装配到应用管道以处理请求和响应的软件。 每个组件:(1)选择是否将请求传递到管道中的下一个组件;(2)可以在管道中的下一个组件之前和之后执行工作。 请求委托用于生成请求管道。 请求委托会处理每个 HTTP 请求。使用以下方法配置请求委托:Run, Map, U 阅读全文

posted @ 2019-01-24 10:26 花阴偷移 阅读 (981) | 评论 (0) 编辑

asp.net core 系列 14 错误处理
摘要:一.概述 本文介绍处理 ASP.NET Core 应用中常见错误的一些方法。主要是关于:开发环境异常页;非开发环境配置自定义异常处理页;配置状态代码页(没有正文响应,http状态400~599的)。 1.1 开发环境异常页 要将应用配置为显示有关异常的详细信息的页面,请使用开发环境异常页。要环境设置 阅读全文

posted @ 2019-01-23 09:17 花阴偷移 阅读 (722) | 评论 (0) 编辑

asp.net core 系列 13 日志
摘要:一.概述 ASP.NET Core 支持适用于各种内置和第三方日志记录, 供程序的日志记录 API,本文介绍了如何将日志记录 API 与内置提供程序一起使用。对于第三方日志记录提供程序使用,文章最后有链接。 1.1 添加内置日志提供程序 日志记录提供程序能够用于显示日志信息或存储日志,比如控制台提供 阅读全文

posted @ 2019-01-22 09:44 花阴偷移 阅读 (940) | 评论 (2) 编辑

asp.net core 系列 12 选项 TOptions
摘要:一.概述 本章讲的选项模式是对Configuration配置的功能扩展。 讲这篇时有个专用名词叫“选项类(TOptions)” 。该选项类作用是指:把选项类中的属性与配置来源中的键关联起来。举个例,假设json文件有个Option1键,选项类中也有个叫Option1的属性名,经过选项配置,这样就能把 阅读全文

posted @ 2019-01-21 11:47 花阴偷移 阅读 (832) | 评论 (1) 编辑

asp.net core 系列 11 配置configuration (下)
摘要:四. 文件配置提供程序AddIniFile、 AddXmlFile、AddJsonFile FileConfigurationProvider 是从文件系统加载配置的基类。 以下配置提供程序专用于特定文件类型: (1) INI 配置提供程序 IniConfigurationProvider: Fil 阅读全文

posted @ 2019-01-18 14:06 花阴偷移 阅读 (804) | 评论 (0) 编辑

asp.net core 系列 10 配置configuration (上)
摘要:一. ASP.NET Core 中的配置概述 ASP.NET Core 中的应用配置是基于键值对,由configuration 程序提供。 configuration 将从各种配置源提供程序操作键值对,这些配置源可以是: (1) Azure Key Vault(是基于云的服务的安全存储应用机密) ( 阅读全文

posted @ 2019-01-17 17:39 花阴偷移 阅读 (1143) | 评论 (0) 编辑

asp.net core 系列 9 三种运行环境和IIS发布
摘要:一.在asp.net core中使用多个环境 ASP.NET Core 配置是基于运行时环境, 使用环境变量。ASP.NET Core 在应用启动时读取环境变量ASPNETCORE_ENVIRONMENT,并将该值存储在 IHostingEnvironment.EnvironmentName 中。A 阅读全文

posted @ 2019-01-16 15:00 花阴偷移 阅读 (1064) | 评论 (6) 编辑

asp.net core 系列 8 Razor框架路由(下)
摘要:三.页面路由操作约定 接着上篇讲asp.net core 系列 7 Razor框架路由。在上篇继续第三节 "页面路由操作约定" 的最后一小节 AddPageRoute 。 使用 AddPageRoute 配置路由,该路由与指定页面关联, 使用指定的路由生成页面链接。 AddPageRoute 使用 阅读全文

posted @ 2019-01-15 16:47 花阴偷移 阅读 (838) | 评论 (0) 编辑

asp.net core 系列 7 Razor框架路由(上)
摘要:一.概述 在上二篇中,主要是介绍了asp.net core mvc中路由的使用,这篇继续介绍路由在ASP.NET Core Razor中的使用。Razor Pages应该使用默认的传统路由,从应用程序的Pages文件夹中提供命令资源。还可以使用其他约定来自定义 Razor Pages 路由行为。 在 阅读全文

posted @ 2019-01-14 11:13 花阴偷移 阅读 (1213) | 评论 (0) 编辑

asp.net core 系列 6 MVC框架路由(下)
摘要:一.URL 生成 接着上篇讲MVC的路由,MVC 应用程序可以使用路由的 URL 生成功能,生成指向操作的 URL 链接。 生成 URL 可消除硬编码 URL,使代码更稳定、更易维护。 此部分重点介绍 MVC 提供的 URL 生成功能,并且仅涵盖 URL 生成工作原理的基础知识。 IUrlHelpe 阅读全文

posted @ 2019-01-11 10:11 花阴偷移 阅读 (1092) | 评论 (7) 编辑

asp.net core 系列 5 MVC框架路由(上)
摘要:一. 概述 介绍asp.net core路由时,我初步想了下,分几篇来说明。 路由的知识点很多,参考了官方文档提取出一些重要的知识点来说。 在ASP.NET Core中是使用路由中间件来匹配传入请求的 URL 并将它们映射到操作(action方法)。路由是在程序启动时进行传统路由或属性路由定义。 路 阅读全文

posted @ 2019-01-09 17:25 花阴偷移 阅读 (1575) | 评论 (4) 编辑

asp.net core 系列 4 注入服务的生存期
摘要:一.服务的生存期 在容器中每个注册的服务,根据程序应用需求都可以选择合适的服务生存期,ASP.NET Core 服务有三种生存期配置: (1) Transient:暂时生存期,在每次请求时被创建。 这种生存期适合轻量级的,无状态的服务。 (2) Scoped: 作用域生存期,在每次请求被创建一次。 阅读全文

posted @ 2019-01-08 10:47 花阴偷移 阅读 (1527) | 评论 (6) 编辑

asp.net core 系列 3 依赖注入服务
摘要:一. 依赖注入概述 在软件设计的通用原则中,SOLID是非常流行的缩略语,它由5个设计原则的首字母构成:单一原则(S)、开放封闭原则(O)、里氏替换原则(L)、接口分离原则(I)、依赖反转原则(D)。本篇介绍依赖反转原则以及在ASP.NET Core中的实现。 直接依赖是指:当一个类需要另一个类协作 阅读全文

posted @ 2019-01-06 11:36 花阴偷移 阅读 (1705) | 评论 (2) 编辑

asp.net core 系列 2 启动Startup类介绍
摘要:一.Startup类 ASP.NET Core 应用是一个控制台应用,它在其 Program.Main 方法中创建 Web 服务器。其中Main方法是应用的托管入口点,Main 方法调用 WebHost.CreateDefaultBuilder来创建 Web 主机,自动分配了 Kestrel Web 阅读全文

posted @ 2019-01-05 13:57 花阴偷移 阅读 (2310) | 评论 (1) 编辑

asp.net core 系列 1 概述
摘要:一. 概述 ASP.NET Core 是一个跨平台的高性能开源框架,可以用来:建置 Web 应用程序和服务、IoT应用和移动后端、在 Windows macOS 和 Linux 上使用喜爱的开发工具、部署到云或本地、NET Core 或 .NET Framework 上运行。 ASP.NET Cor 阅读全文

posted @ 2019-01-02 13:49 花阴偷移 阅读 (2623) | 评论 (5) 编辑

原文地址:https://www.cnblogs.com/Leo_wl/p/11736385.html