P1 创建项目(上)
开发的时候尽量使用VS2019
安装的时候只需要勾选这一项就可以了
这是安装完成之后
项目起名叫做Three
选择.net core这里就可以看到 ASP.NET Core 3.0了。
如果前面选择的是.NET Framework的话,后面就看不到 .net Core 3.0了。这是因为.net Core 3.0只工作于.net Core
Https这里 使不使用都可以
然后就会创建项目
这就是刚建好的项目
首先右键项目的属性,看到Target Framework的版本是3.0
也可以点击右键Edit Project File
可以看到TargetFramework就是刚才我们在右键属性里面看到的东西。
双击解决方案名称,和上面的效果是一样的。
在.net core 2.x的时代,.net core项目有一个依赖的包。叫做asp.net core meta package是一个挺巨大的包,里面有asp.net core需要的基本的东西,它里面都有,
现在 在.net Core 3.0里面,发生了一些变化。
之前说的meta package包是没有了。现在是属于 .net core3.0的一部分。所以你装完.net core SDK以后这个包就有了。 而且只要.net core进行升级,这些包里面的东西也会跟着升级。
3.0的依赖发生了变化。
先看下Program里面有个Main方法,项目执行的时候就会找到这个Main方法然后执行。,net core项目本质上是一个控制台项目。
Main方法的作用就是配置了整个asp.net core的应用,然后就运行,就是这个意思。
争对这整个应用的配置就是通过CreateHostBuilder来进行的,它的返回类型是IHostBuilder
CreateHostBuilder返回IHostBuilder类型之后然后执行了build方法,执行完build方法之后,这整个应用就相当于从控制台应用变成了.net core应用,
它使用了一些默认值,所以这个方法就叫做ConfigureWebHostDefaults
它在里面怎么配置呢,例如.net core这个应用它是如何处理这个配置文件和web应用服务器,以及路由的一些配置 等等。很多默认配置都是在这里完成的,当然我们也可以修改这些默认配置,也可以添加自己想要的配置。
比如说默认.net core应用会加载appsetting.json这个文件作为配置文件。如果你想修改这个配置,或者是添加其他的文件作为配置文件。
我们就可以使用webBuilder.ConfigureAppConfiguration这个方法
webBuilder使用了Startup这么一个类文件。
startup里面也是用来进行配置的,这里面配置相对比较动态。
Program里面的配置就相对比较死板。
Startup类没有实现任何的接口,也没有继承与其他任何的类,就是一个普通的C#类。运行时是通过约定来对他进行调用的。
调用它里面两个方法,一个ConfigureService()一个是Confiure()方法。这两个方法的调用顺序就是先调用ConfigureService()然后再调用Confiure()
ConfigureService方法主要是负责配置依赖注入相关的东西,
依赖注入
下面就来说一下依赖注入,.net core不可分割的一部分,依赖注入依赖IoC容器。Ioc就是控制反转,
当我们的.net core应用启动的时候,有一些类或者是类型就会在容器里面注册。
而这些类用典型DI术语来说,他们就叫做服务Services,这些服务注册以后,其他的一些类型,包括这些类型本身,都可以向这个IoC容器请求这些注册的服务的实例,
而且在注册的时候,也可以请求这些注册实例的服务的生命周期是什么样的
所以这些实例的服务的生命周期是由Ioc容器来控制的,而这些服务的对象的生命周期又分为三种,
Transient:注册的服务的实例,在每次请求的时候都会生成一个新的实例,
Scoped:是指.net core里面会有web请求,我们的服务就会跟着这个web请求,一次web请求就产生一个实例。它的生命到什么时候截止呢?就是web请求最终被处理完,它的声明周期就截止了。
Singleton:服务的实例一旦被创建,那么以后所有请求这个服务的都会用这一个实例。它会一直存活到直到我们的应用程序停止。
我们可以在ConfiureServices里面注册一些服务,注册到我们的IOC容器里面,
这里打算使用.net core MVC所以这里需要注册。在core 2.0注册mvc使用的是AddMVC。在3.0里面我们就是用AddControllerWithViews()
它表示什么呢?我们看下官方的文档。它包括Controllers Api相关的功能,但是不包括,Pages相关的。它就是传统的MVC
如果想支持RazorPage就是使用下面这个方法
如果我这个应用只是做api类的。不需要Views。我们直接使用AddControllers就可以了。这就不需要Views层。
AddMvc提供的功能过于强大,我们不需要这么多的功能。
目前来说我们使用MVC,使用AddControllersWithViews()就可以了。
创建自己的服务
新建Services文件夹。
首先新建一个接口
叫做IClock
然后再创建两个类。一个叫做ChinaClock
让它实现IClock这个接口。
创建另外一个类叫做
UtcClock也是实现IClock这个接口。
注册自己写的服务
AddSingleton表示注册的服务在.net core声明周期里面只有一个实例,直到整个应用程序停止才会销毁,
后方面的方括号里面表示,每当有一个其他类型请求IClock实现了这个接口的对象的时候,我们这个IOC容器就会返回ChinaClock这个类的实例。
使用这个服务,创建Controllers文件夹。
新建HomeController。按照约定都以Controller结尾
让他继承与Controller这个类,
ctor创建一个构造函数
构造函数内注入IClock
如果想注入UtcClock,这里就这么配置。
我们的Controller代码并没有更改,但是注入的类型就变成了UtcClock的类型。
所以要尽量使用接口的这种形式,例如IClock
这样使用接口以后,我们的Controller实际上跟具体这个服务类(服务类当前配置的是UtcClock),他俩之间就解耦了。
DI的优点
结束