项目配置
一、依赖注入
默认情况下ASP.NET Core项目会加载一个appsettings.json这个文件作为配置文件
说一下依赖注入
依赖注入是ASP.NET Core里一个不可分割的部分,而
依赖注入的这个机制是依赖于IOC容器
(IOC的中文意思:控制反转)
依赖注入原理应用
当我们的应用
程序启动
(ASP.NET Core应用)的
时
候,有一些
类或者是一些类型
,会
在容器里
面进行
注册
,而
这些类型
用DI典型术语来说
叫做服务(service)
而这些
服务注册以后
,
其他
的
类型
,
包括
这些
类型本身
都可以向IOC容器来请求这些注册的服务的实例
,而且在注册的时候,你也可以设置这些实例的服务的生命周期。
服务的实例的生命周期是由IOC容器来控制的
而这些服务的实例的生命周期又分为3种
·生命周期
-Transient:
注册的服务在每次被请求的时候,都会生成一个新的实例
-Scoped:
指ASP.NET Core里面会有Web请求,而我们服务的实例会跟着Web请求,一次Web请求产生一个实例。Web请求被处理完的时候,生命周期就截止了。
-Singleton:
我们服务的实例一旦被创建,以后所有请求这个服务的时候,都会只用这一个实例。它会一直存活到直到我们的应用程序停止。
下面的例子我将注册一个自己的服务
新建一个文件夹;
再新建一个接口;
再创建两个类
用class:ChinaClock实现IClock接口
class:UtcClock也是实现IClock接口
像这个服务选择Singleton比较合适,泛型怎么写:先写接口IClock,再写具体的类,我们先注册ChinaClock.
这是怎么个意思呢,首先AddSingleton表示我们注册这个服务的生命周期。
后面泛型<>里面写的什么意思呢:每当有其他类型请求一个IClock,实现了这个接口的对象的时候,我们这个IOC容器就会返回一个ChinaClock这个类的一个实例。
我们来使用这个服务,就在项目里建立一个文件夹Controllers,再建立一个HomeController这么一个类,直接使用这个类
我们建立的HomeController直接让它继承Controller这个类,然后写一个构造函数,这里面我注入一个参数IClock,然后起个名叫clock。
这样写呢,构造函数里面的参数,我们整个ASP .NET Core的整个应用就会保证:如果你这个参数它的类型注册到了我们这个IOC容器里面了,那么它所对应的具体的类它的实例就会返回回来。
所以说我们注入的是IClock,注册的是ChinaClock这个具体的类。所以到这步,实际注入的是ChinaClock。
这种就叫做依赖注入,叫构造函数注入。注入了一个IClock对应的类的一个实例。
如果我不想注入ChinaClock而是注入UtcClock,则可以写<IClock ,UtcClock>
这样写不会改动Controller的代码,只需要改动接口处的就可以了。(使用接口之后,Controller跟具体的服务类它俩之间就解耦了)
DI优点
·解耦,没有强依赖。
(类型之间进行解耦,比如说Controller这个类和服务类之间就没有强依赖。它俩同时依赖于一个接口(相当于依赖一个抽象))
-利于单元测试
(因为解耦)
·不需要了解具体的服务类
(不需要了解一些结构、内部细节等等)
·也不需要管理服务类的生命周期
(生命周期由IOC容器来控制的)
二、 ASP .NET Core管道(pipeline)
Configure方法是做什么用的呢?
这个方法,它配置了ASP.NET Core针对处理http请求,它有一个管道,它就是配置这个管道用的。
我们的 ASP .NET Core管道 会使整个应用对http请求是如何进行响应。
当你的ASP.NET Core应用 从浏览器接收到http请求之后,这个请求是从管道里面进来的,之后再从管道回去。
如果这个管道里面什么都没有,那么这个请求过来、回去,就什么都不会发生。
所以如果你想让ASP .NET Core这个应用能发挥作用的话,就应在管道里面放一些东西。而我们把放在管道中间的(能够处理请求的)东西叫做中间件(middleware)。
举个例子,比如我们使用的MVC框架,在这里就是一个中间件,我们可以把它放在管道里。但是通常可能会进行一些身份认证,所以说身份认证的中间件通常会放在MVC的前面。而在ASP .NET Core里面,如果我们shifu这个静态文件的话 ,比如说js文件、html文件、css文件,这个时候我们需要使用Static Files这个中间件。
而在这个http请求进来的时候,我们这些中间件能够处理哪些东西呢?
在中间件里面我们可以看到请求的数据,以及我们Web Server相关的东西或者说是特性。我们使用中间件可以对这些东西进行处理或者是写入一些东西等。
三、Configure方法
我们继续看Configue方法。
第一行表示如果我们这个环境是开发环境(这个模式是通过设置一个环境变量,你可以设置它的值为development或production等),它就是判断你这个环境变量的值是不是development。
如果是,就用了下面的一个中间件(工作原理:如果我们在开发的时候,这个程序发生了一些异常,并且这个异常没有做处理的话,那么就会把这个异常错误信息展示在页面里,页面里会有这个错误的详细信息),这个中间件就是干这个用的。
所以在开发模式下,插入到管道的第一个中间件是这个。
四、端点 endpoint
·端点就是进来的http请求的
url的结尾那部分
(
也就是端点
),这部分会被中间件进行处理。
用过MVC的话就会知道,如果
想处理这些端点
(也就是url结尾这部分),你就
需要指定一下路由。
指定路由有两种方式:
第一种是在Controlller上面写一些属性。
第二种是指定一个路由表,设定的这些路由,实际上就是一些模版,这些模版它们会尝试匹配一些特定的URL端点,
所以说路由的工作原理简单来说就是这样
·/{controller}/{action}
·/home/index
五、ASP.NET Core应用的多样性
ASP.NET Core应用其实是由多种技术存在的
·MVC:/Home/Index
MVC本身需要路由,比如说特定的一个页面有可能是Home或Index.MVC需要路由。
·Razor Pages:/SomePage
这是另外一种应用形式,它也需要路由,需要一些网址来访问一些特定的页面。
·SignaIR:/Hub/Chat
另外一种技术,也需要路由,比如说我们做一个聊天应用,它肯定也需要做一个网址,才能进行通信。