第 3 章 ASP.NET Core 核心特性

3.3 依赖注入

通常情况下,应用程序由多个组件构成,而组件与组件之间往往存在依赖关系

当我们需要获取数据时,通常的做法是实例化依赖的类,然后调用类里面的方法,但是这种依赖方式会增加调用方和被调用方之间的耦合,也会增加应用程序维护成本及灵活性,同时增加了单元测试的难度

为了解决这一问题,需要用到依赖倒置原则,高层不直接依赖低层,两者均依赖抽象

public class Book{}public interface IDataService{    List GetAllBooks();}public class DataService : IDataService{    public List GetAllBooks()    {        return new List();    }}public class DisplayDataService{    private readonly IDataService _dataService;    public DisplayDataService(IDataService dataService)    {        _dataService = dataService;    }    public void ShowData()    {        var data = _dataService.GetAllBooks();    }}

接下来,只需要在实例化 DisplayDataService 的时候,在构造函数传入一个 IDataService 接口的具体实现即可

IDataService dataService = new DataService();DisplayDataService displayDataService = new DisplayDataService(dataService);

除了构造函数注入之外,还有属性注入和方法注入

当应用程序中有多处要用到依赖注入时,就需要一个专门的类来负责管理创建所需要的类并创建所有它可能要用到的依赖,这个类就是依赖注入容器,也可以称为控制反转容器,IOC 容器

在 ASP.NET Core 中,所有被放入依赖注入容器的类型或组件被称为服务

容器中的服务有两种类型:第一种是框架服务,它们是 ASP.NET Core 框架的组成部分;另一种是应用服务,所有由用户放到容器中的服务都属于这一类

在 ASP.NET Core 内置的依赖注入容器中,服务的生命周期有如下3种类型:

  • Singleton:容器会创建并共享服务的单例,且一直会存在于应用程序的整个生命周期内
  • Transient:每次服务被请求时,总会创建新实例
  • Scoped:在每一次请求时会创建服务的新实例,并在这个请求内一直共享这个实例

3.4 MVC

MVC 是模型、视图、控制器的缩写,它是 Web 应用程序中一种常见的架构模式,最主要的优点是实现了关注点分离

在 ASP.NET Core MVC 框架中,除了 Controller、Model 和 Action 外,它还包括路由、模型绑定、模型验证和过滤器等功能

路由的主要功能是根据预先配置的路由信息对客户端传来的请求进行路由映射,映射完成后,再将请求传给对应的路由处理器处理

对于 ASP.NET Core MVC,定义路由的方法有以下两种:

  • 基于约定的路由
  • 特性路由

基于约定的路由需要在 Startup 类中指明,具体来说,应该在配置 MVC 中间件时来设置路由约定

app.UseMvc(routes =>{    routes.MapRoute("default",template: "{controller}/{action}");});

以下约定为 controller 和 action 设置了默认值,参数 id 后面有一个问号,说明这个参数时可选的,在 URL 中有无此项都可以,注意,一个 URL 模板中只能有一个可选参数,并且只能放在最后

app.UseMvc(routes =>{    routes.MapRoute("default",template: "{controller=Home}/{action=Index}/{id?}");});

指定参数时,也可以添加约束

app.UseMvc(routes =>{    routes.MapRoute("default",template: "{controller=Home}/{action=Index}/{id:int}");});

特性路由只需要在 Controller 类或 Action 方法上添加 [Route] 特性即可

[Route("Home")]public class HomeController : Controller{    [Route("Index")]    public IActionResult Index()    {        return View();    }}

当 Controller 需要依赖其他服务时,通常的做法是使用构造函数注入所需要的服务,当程序运行时,ASP.NET Core 会在创建 Controller 时自动从其依赖注入的容器中获取所有依赖的服务,需要注意的是,所注入的服务必须存在于容器中,否则会发生异常

Action 的返回结果有以下4类:

  • StatusCode
  • ObjectResult
  • 重定向结果
  • 内容结果

模型绑定:将 HTTP 请求中的数据映射到 Action 中参数的过程

ASP.NET Core MVC 模型绑定特性:

  • [FromHeader]
  • [FromQuery]
  • [FromServices]
  • [FromRoute]
  • [FromForm]
  • [FromBody]

还有两个特性用于指明参数是否必须使用绑定:

  • BindRequiredAttribute
  • BindNeverAttribute

模型验证:指数据被使用之前的验证过程,它发生在模型绑定之后

数据注解通常用于验证,只要为类的属性添加需要的数据注解验证特性即可:

  • [Required]
  • [MinLength(10)]
  • [Url]
  • [Range(1,5)]

在 Controller 内的 Action 中,要检查一个对象是否满足指定的条件,只要调用 ModelState.IsVaild 属性,其中 ModelState 是 ControllerBase 类的属性

ASP.NET Core MVC 提供两种创建自定义验证的方法:

  • 创建新特性,并使它继承自 ValidationAttribute 类
  • 使待验证的 Model 实现 IValidatableObject 接口

过滤器:与中间件很相似,在 ASP.NET Core MVC 中,它们能够在某些功能的前后执行,由此形成一个管道

ASP.NET Core MVC 提供了以下5种类型的过滤器:

  • Authorization
  • Resource
  • Action
  • Exception
  • Result

当要创建过滤器时,应该实现 IXXXFilter 或 IAsyncXXXFilter,前者同步,后者异步,实现一个即可

在 startup 种注册过滤器会使它影响到应用中的每个 Action,如果要仅为一个或少数几个 Action 添加过滤器,就得使用特性,ASP.NET Core 为每一种类型的过滤器都定义了相应的特性

如果以特性的方式使用包含依赖项的过滤器时,就会出错,因为在自定义特性的构造函数中定义的接口类型的参数并不是有效的特性参数,此时需要使用 [ServiceFilter] 特性或者 [TypeFilter] 特性,并设置它们的 Type 属性为自定义过滤器类型

[ServiceFilter] 特性与 [TypeFilter] 特性的区别是前者会从容器中获取过滤器实例,而后者不会,它使用 ObjectFactory 对指定的过滤器类型进行实例化,如果使用前者,需要在 Startup 类的

asp绑定gridview属性_《ASP.ENT Core与RESTful API开发实战》(第3章)中相关推荐

  1. 《ASP.NET Core 与 RESTful API 开发实战》-- (第10章)-- 读书笔记

    第 10 章 部署 10.1 部署到 IIS ASP.NET Core 应用程序支持部署到 IIS 中,之后它将作为应用程序的反向代理服务器和负载均衡器,向应用程序中转传入的 HTTP 请求 默认情况 ...

  2. asp绑定gridview属性_理解ASP.NET Core中的模型验证

    当MVC执行模型绑定后,为了验证绑定为参数提供的值是否符合预期,还需要进行模型验证. 一.理解模型验证 模型验证是指模型绑定后对Action参数进行验证的过程.它会根据事先定义的规则对参数的值进行验证 ...

  3. asp绑定gridview属性_如何在ASP.NET Core中自定义Azure Storage File Provider

    主题:如何在ASP.NET Core中自定义Azure Storage File Provider 作者: Lamond Lu 地址:  https://www.cnblogs.com/lwqlun/ ...

  4. asp编程工具_使用ASP.NET Core构建RESTful API的技术指南

    译者荐语:利用周末的时间,本人拜读了长沙.NET技术社区翻译的技术文章<微软RESTFul API指南>,打算按照步骤写一个完整的教程,后来无意中看到了这篇文章,与我要写的主题有不少相似之 ...

  5. 使用ASP.NET Core构建RESTful API的技术指南

    译者荐语:利用周末的时间,本人拜读了长沙.NET技术社区翻译的技术文章<微软RESTFul API指南>,打算按照步骤写一个完整的教程,后来无意中看到了这篇文章,与我要写的主题有不少相似之 ...

  6. 52abp框架asp.net core Angular全栈开发实战视频课程

    课程标题 52abp框架asp.net core & Angular全栈开发实战视频课程 课程简介 从零开始学 52ABP企业开发框架,企业项目是如何开发和技术选型,代码如何管理,团队协同开发 ...

  7. restapi是什么意思_深入理解什么是RESTful API ?

    前言:最近两年很火爆的网络框架Retrofit,使用它的时候,查看文档会告诉你,要求后台的服务器哥们必须符合REST规范给你设计接口,作为安卓开发工程师来说,我就很奇怪了,REST规范到底是啥?本着极 ...

  8. hive 行转列和列转行的方法_读离线和实时大数据开发实战,为你揭开 Hive 优化实践的神秘面纱...

    前言 「1024,1GB,一级棒!程序仔们节日快乐!」 ❝ 指尖流动的 1024 行代码,到底是什么? ❞ ❝ 是10行的迷茫?是101行的叛逆?是202行的理性思考?是307行对渴望的冲动?还是40 ...

  9. 启动服务错误5拒绝访问_【Go API 开发实战 5】基础1:启动一个最简单的 RESTful API 服务器...

    启动一个最简单的 RESTful API 服务器 本节核心内容 启动一个最简单的 RESTful API 服务器 设置 HTTP Header API 服务器健康检查和状态查询 编译并测试 API 本 ...

  10. falcon框架_如何使用Falcon构建RESTful API

    falcon框架 介绍 (Introduction) RESTful APIs are a major component of any well-architected stack, and Pyt ...

最新文章

  1. JQuery制作的toolTip,针对图片预览效果
  2. pythonpandas用sql查询数据表_python pandas read_sql_query使用记录
  3. VTK:可视化之MoveCamera
  4. BufferedWriter_字符缓冲输出流
  5. java tcp 仿真工具_MODBUS-TCP Client Tester(免费从站仿真工具)V1.01 最新版
  6. 思科从服务器恢复配置文件,思科服务器网关配置文件
  7. java系列:引用类型和基本类型
  8. Python函数的静态变量
  9. jinja2模板注入_Flask(Jinja2) 服务端模板注入漏洞
  10. cocos2dx3.2 画图方法小修改之 C++ final学习
  11. UCML 参与者关键 与依赖关联外键
  12. 我要注意的Java编码规范
  13. 随机梯度下降法(SGD)
  14. 使用MagicRecon在挖洞时最大化数据收集量
  15. [译] iOS 11:机器学习人人有份
  16. 洛谷 P5708 【深基2.习2】三角形面积(C)
  17. 三维空间的三角剖分( 3D Delaunay Triangulated graph)第一部分:从二维空间的三角剖分做起
  18. 程序猿 那些值得收藏的网站
  19. Product Quantization for Nearest Neighbor Search论文实验
  20. MATLAB 声音文件处理

热门文章

  1. 决定员工发展命运的34条重要行为规范
  2. 为了健康,别做这20件事
  3. flash应用中的一个安全隐患
  4. oracle中lang的作用,【Oracle】详解Oracle中NLS_LANG变量的使用
  5. k8s拉取harbor镜像_Kubernetes-连接Harbor仓库拉取镜像
  6. aop实现原理_Spring学习之AOP
  7. c语言指向读取的字节数的指针,c - C语言中指针的大小 - SO中文参考 - www.soinside.com...
  8. java 截取掉数字前面的0_java 保留字符串数字的位数,不够前面补0
  9. C# 读取json文件与写json文件
  10. div覆盖在dropdownlist之上的方法