ASP.Net Core 2.2 MVC入门到基本使用系列 (三)(转)
本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力.
本教程知识点大体分为以下几个阶段
- ASP.Net Core MVC基础知识
- Startup基本配置和理解
- Controller使用
- Razor视图
- 传统视图
- Model Validation (基本用法)
- 一点点的Vue (教程使用Vue配合)
- SqlSugar ORM (进行数据库交互)
- Entity Framework Core(基本介绍使用)
- 授权和身份验证(MVC的, WebApi的不进行介绍)
- 安全性
- 测试 / 单元测试
- 性能基本优化
- 日志功能
- CI/CD
- Windows部署
- Linux部署
想必大家都知道ASP.Net Core MVC默认自带了DI容器的, 我们可以很方便的进行使用, 来方便管理对象和生命周期, 那么这一节我就会详细讲解服务注册, 顺便简单讲解一下管道, 让大家知道了基本的MVC运行流程.
回顾一下上一节的内容, 我们从配置文件中获取了输出的字符, 也介绍各个配置的 "优先级" (其实是配置覆盖), 那么我们这一节以服务的方式输出这个字符串, 然后用过DI进行注册服务, 快速了解服务注册.
DI容器呢, 依赖接口, 所以我们先新建一个接口, 就叫 IWelcome , 接口里面定义个方法, 叫GetWelcomMsg, 然后再建个类, 实现这个接口, 这样, 我们的一个最基本的服务就做好了. 代码结构和代码如下图 (我建了个文件夹, 存放这些服务):



代码编写完之后, 我们尝试在Configure方法里面注入引用这个接口, 因为我们获取配置信息的时候也是直接在这个方法里面注入使用的, 那我们来试试, 代码如下图 :

一切都很正常, 方法也能调用, 我们跑起来试试看, 能不能正常使用.
一点都不意外, 它报错了, 报错信息如下图 :

意思就是无法解析IWelcome这个服务, 也是就无法注入这个服务.
那么为什么 IConfiguration, IHostingEnvironment, IApplicationBuilder等等之类的接口, 我们能直接注入使用呢, 那是ASP.Net Core MVC里面的源包里面, 已经自动为我们注册好了这几个服务, 我们直接可以使用. 我们要使用自定义的服务或者组件, 需要我们自己进行注册.
说到自定义服务注册, 就不得不说服务注册的几种方式, 或者说是几种不同的注册方法. 总共分为三种, 也就是三个注册服务的方法.
我们看看 Startup 这个类, 会发现它里面有个ConfigureServices方法, 看名字就知道, 它是配置服务用的, 有个IServiceCollection接口参数, 这个接口就是.Net Core默认提供的DI服务的接口管理对象, 我们所有注册的服务都可以通过这个接口进行管理或操作. 如果使用第三方包, 如Autofac另说, 这里不介绍Autofac的使用.
那么我们就可以通过IServiceCollection接口进行我们自定义服务的注册了, 上面提到了有三个注册服务的方法, 分别是 :
1. AddSingleton (单例模式注册服务, 也就是在整个应用程序中, 只会创建一个接口对象, 所有的请求都会使用这个接口对象, 可能会有并发问题)
2. AddTransient (管道机制注册服务. 也是在每个请求发生的时候, 都会创建一个接口对象, 给当前请求使用)
3. AddScoped (会话机制注册服务. 也就是在当前会话中, 只会创建一个接口对象. 什么是一个会话, 可以简单理解为当前浏览器打开到关闭, 这个过程就是一整个会话的过程)
那么这里, 我们先使用AddSingleton单例模式注册服务, 代码如下 :
services.AddSingleton<IWelcome, Welcome.Services.Welcome>();
上面提到的三个方法, 使用方式都一样, 都是两个泛型参数, 第一个泛型参数是接口, 第二个是泛型参数是接口实现类.
那么再运行一个我们的程序, 可以看到浏览器正常输出我们的字符串了.
至于上面三个不同生命周期的注册方法, 怎么使用, 看服务的用途, 一般我推荐使用AddScoped注册服务
到这里, 我们一个简单的服务就从定义到实现到注册到使用就完成了. 是不是很简单呢.
下面我们简单讲讲ASP.Net Core MVC的管道
这里我只会简单讲解ASP.Net Core MVC的管道运行流程, 不会讲解从监听端口到转发到ASP.Net Core MVC里面是怎么实现的
比如我们现在发起一个Get请求, 在MVC收到这个请求的时候, 我们的管道流程就开始运行了, 它会最先触发Logger这个中间件, 就是日志中间件, 这个中间件里面可以获取很多信息, 比如请求头部信息, 参数信息等等, 甚至我们可以对这些信息进行修改. 这些信息也会在控制台输出, 如果用的是dotnet run命令运行这个MVC程序的话, 这里不放截图了, 你们可以自己试试
在日志中间件执行完之后, 就会执行其它的中间件, 如果我们启用了其它的中间件. 比如我们启用了身份验证中间件, 那么在日志中间件执行完成之后, 就会执行身份验证中间件, 进行身份验证, 如果验证成功了, 继续下一步处理, 如果验证失败了, 就做其它处理, 比如重定向到登录页面等等.
在这一步执行完成之后, MVC管道就会进入路由匹配的过程. 如果匹配成了, 就正常返回HTML或JSON或XML数据等等, 如果匹配失败了, 就404错误等等.
这就是ASP.Net Core MVC管道的一个基本流程, 其实里面做的事情远远不止这些, 这里就不做深入的讲解, 如果有需要, 自行学习. 因为讲一个真正的管道机制, 一下子也讲不完. 这里的目的只是要大家基本了解ASP.Net Core MVC的基本运行流程.
ASP.Net Core 2.2 MVC入门到基本使用系列 (三)(转)的更多相关文章
- ASP.Net Core 2.2 MVC入门到基本使用系列 (三)
本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...
- ASP.Net Core 2.2 MVC入门到基本使用系列 (二)
本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...
- ASP.Net Core 2.2 MVC入门到基本使用系列 (四)
本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...
- ASP.Net Core 2.2 MVC入门到基本使用系列 (一)
本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...
- ASP.Net Core 2.2 MVC入门到基本使用系列 (四)(转)
本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...
- ASP.Net Core 2.2 MVC入门到基本使用系列 (二)(转)
本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...
- ASP.Net Core 2.2 MVC入门到基本使用系列 (一)(转)
本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...
- ASP.NET Core 2.0 MVC项目实战
一.前言 毕业后入职现在的公司快有一个月了,公司主要的产品用的是C/S架构,再加上自己现在还在学习维护很老的delphi项目,还是有很多不情愿的.之前实习时主要是做.NET的B/S架构的项目,主要还是 ...
- 《ASP.NET Core项目开发实战入门》带你走进ASP.NET Core开发
<ASP.NET Core项目开发实战入门>从基础到实际项目开发部署带你走进ASP.NET Core开发. ASP.NET Core项目开发实战入门是基于ASP.NET Core 3.1 ...
随机推荐
- 在eclipse中导入hadoop jar包,和必要时导入源码包。
1. 解药hadoop包 1, C:\hadoop-2.7.2\share\hadoop 提取出所有的 jar 包, 到 _lib 文件夹下 2,将有含有source 名称的jar包 剪切出来 3, ...
- POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 Description After going through the receipts from your car trip ...
- debian设置软件源为阿里云
首先编辑sources.list这个文件 sudo vim /etc/apt/sources.list 把sources.list文件内容替换成如下 deb http://mirrors.aliyun ...
- 洛谷P5234 越狱老虎桥 [JSOI2012] tarjan
正解:tarjan+贪心(?并不会总结是什么方法QAQ,,, 解题报告: 传送门! 这题是真的题意杀,,,我我我要不是之前知道题目大意了我怕是怎么看都看不懂这是个什么意思昂QAQ 所以先说下题目大意好 ...
- javascript 实例 静态 公共 私有
传统 javascript 的原型对象 和 ts的类 对比 传统原型队形说明: //对象构造函数 function Atest(name) { //私有属性,只能在对象构造函数内部使用 var cla ...
- System.getProperty("user.dir")
/**获得当前类的完整路径.最后一句*/package test;import java.net.MalformedURLException;import java.net.URI;import ja ...
- centos mysql安装 完全版
在linux中安装数据库首选MySQL,Mysql数据库的第一个版本就是发行在Linux系统上,其他选择还可以有postgreSQL,oracle等 在Linux上安装mysql数据库,我们可以去其官 ...
- http://lib.csdn.net/article/reactnative/40118
http://lib.csdn.net/article/reactnative/40118 ES6学习笔记(四)--数值与数组 作者:SirM2z 数值的扩展 Number.isFinite(), N ...
- [js]this和call.call
JavaScript 的一大特点是,函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念. https://www.cnblogs.com/coco1s/p/4833199. ...
- 继承时,当父子类都具有相同的成员变量,默认情况下是直接调用子类的成员变量,当要调用父类的成员变量则需要使用super关键之
package day02; public class Person { String name="fl"; }class Car{ }class Student extends ...