书接上文:上一节中,我们已经实现Services 层。(https://www.cnblogs.com/xuzhencheng/p/11424751.html)
但是具体要如何将服务依赖注入进来呢?继续来续写我学习笔记!这节中更多的是关于NetCore 的一些基础知识。如果基础不错的小伙伴,可以略过!
正文:
看过之前博客的同学们应该对下面这张图不陌生:
图中,红色标记的,基本上都是NetCore 自带的。包括Nlog,算是net Core涉及到的语法糖。
这一节中,我将从下面几个方面对NetCore 的技术点进行说明。园子里对netCore 的讲解其实很多,我的侧重点在于结合我们现在要搭建的开发框架。进行相应的说明:
0.WebAPI 项目的建立
1..NetCore 项目执行(加载)过程
2.中间件的执行过程
3.WebAPI 的路由
4.依赖注入
5.异步编程
---------------------------------------------------------假装的分割线------------------------------------------------------------------------------
0. web API项目的建立
这部分内容,其实没什么太多可说的,最最基础的了。我就默认大家都会了。
不过还说有要说明的一点,随着Core3.0 的发布,可能有部分同学,想新建自己基于NetCore3.0 的项目。在大家去下载skd 的时候,可以看到微软的提示,要求VS更新到V16.3 以上。
然后,打开自己的VS,检查更新,执行更新操作就行了。
更新好VS2019 之后,就是下载下载,并安装netCore skd 了,大家都是成年人了,这个地方我就不占用篇幅进行介绍了。
需要说明的是,我现在的示例项目还是基于netcore 2.2 进行构建的。后期的时候,会单独出一片2.2 升级 3.0 的文章(其实网上已经很多了。。)
接下来就是新建项目的流程,这个部分我就不一一截图展示了。
1..NetCore 项目执行(加载)过程
接下来我们把精力集中在这一节,我个人认为这部分算得上是NetCore 的核心,也是对比.netFreamwork 来说,改变比较大的。
下面这张图,是我在园子里找的,FlyLolo 的博客里。https://www.cnblogs.com/FlyLolo/p/ASPNETCore2_5.html (也是一个介绍NetCore 的系列,有兴趣同学可以看一下。讲的很好。)
.
首先是程序起点,拿我们所建的Web API 工程来说,程序起点已经不再是Global.asax文件也没有了Application_Start() 方法,而是统一了Program.cs文件中的 Main() 函数作为程序入口。
在CreateWebHostBuilder方法中,创建并配置WebHostBuilder: 首先调用CreateDefaultBuilder( 它是一系列配置的大综合), 进行一系列配置之后, 调用 UseStartup<T>()
在CreateDefaultBuilder这里,我的理解是这样的,NetCore 项目的运行,我们可以在这个地方引用一些它内置的一些东西。比如像UseKestrel、UseIISIntegration、UseConfiguration等下。像下图这样:
但是除了NetCore 框架里面自带的这些东西以外 呢,我们可能还需要引入一些比如像Mvc、EF、Swagger等其他的一些第三方的库也好,框架也好。
那这部分内容我们怎么办呢?就是在UseStartup<T>()这里来做配置和引用了。也就是Startup.cs 。
在这里,除了构造函数以外,还有两个方法,一个是ConfigureServices、一个是Configure。看英文注释已经说的很明白了。都是在runtime 到时候会被调用。
区别是,ConfigureServices是用来做依赖注入的,在这里我们可以通过依赖注入的方式,add sercices
Configure呢,是用来配置HTTP request 管道的。
以上这些,就是我对NetCore 的加载过程的一些理解,可能有所偏差。但能力有限。希望大家可以发表自己的看法,对我所说的做一些修正。
2.中间件的执行过程
这一张图,我觉得对中间件,基本上对中间件的执行过程做了一个很好的说明。但是提到中间件,就不得不提一下过滤器(Filter)
同作为两个AOP利器,过滤器更贴合业务,它关注于应用程序本身,比如你看ActionFilter
和 ResultFilter
,它都直接和你的Action,ActionResult交互了,是不是离你很近的感觉,那我有一些比如对我的输出结果进行格式化啦,对我的请求的ViewModel进行数据验证啦,肯定就是用Filter无疑了。它是MVC的一部分,它可以拦截到你Action上下文的一些信息,而中间件是没有这个能力的。
那么,何时使用中间件呢?我的理解是在我们的应用程序当中和业务关系不大的一些需要在管道中做的事情可以使用,比如身份验证,Session存储,日志记录等。其实我们的 asp.net core项目中本身已经包含了很多个中间件。
整个中间件的创建和使用,我找了一个别人的例子:(https://www.cnblogs.com/haosit/p/7754257.html)
1.1 必须有一个RequestDelegate 委托用了进入一个中间件
1.2 通过构造函数设置这个RequestDelegate委托
1.3 必须有一个方法Task Invoke,在这个方法里编写中间件内容最后执行RequestDelegate委托
1 using Microsoft.AspNetCore.Http; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Threading.Tasks; 6 7 namespace Haos.Develop.CoreTest 8 { 9 public class TestMiddleware 10 { 11 protected RequestDelegate Next; 12 13 /// <summary> 14 /// 参数 15 /// </summary> 16 public string Str { get; set; } 17 18 public TestMiddleware(RequestDelegate next,string s) 19 { 20 Next = next; 21 Str = s; 22 } 23 24 public virtual Task Invoke(HttpContext context) 25 { 26 context.Response.WriteAsync("this is test string"); 27 return Next(context); 28 } 29 } 30 }
2.编写一个扩展方法用来添加到程序中
1 using Haos.Develop.CoreTest.Service; 2 using Microsoft.AspNetCore.Builder; 3 using Microsoft.Extensions.DependencyInjection; 4 using System; 5 using System.Collections.Generic; 6 using System.Linq; 7 using System.Threading.Tasks; 8 9 namespace Haos.Develop.CoreTest 10 { 11 public static class Extension 12 { 13 public static IApplicationBuilder UserTestMiddleWare(this IApplicationBuilder app, string str) 14 { 15 return app.UseMiddleware<TestMiddleware>(str); 16 } 17 } 18 }
3.在Startup添加中间件
1 public void Configure(IApplicationBuilder app, IHostingEnvironment env) 2 { 3 if (env.IsDevelopment()) 4 { 5 app.UseDeveloperExceptionPage(); 6 } 7 //扩展方式添加 8 app.UserTestMiddleWare("this is test param"); 9 //直接添加中间件方式 10 app.Use((context, next) => 11 { 12 context.Response.WriteAsync("this is test"); 13 return next(); 14 }); 15 }
后期我们的框架逐渐的增加日志,身份验证,异常处理的时候,都会用到中间件。所以说,对于NetCore 项目来说,这还是很重要的一环。
这一节本来想简单说一下理论性的东西的,但是不知不觉写了这么多。所以把这部分内容分为两节来写吧。
3.WebAPI 的路由、4.依赖注入、5.异步编程 还说留给下一节吧。
最后:老张发布了Blog.Core 开发社之招募计划书 (https://www.cnblogs.com/laozhang-is-phi/p/11603456.html) 有实力的小伙伴抓紧报名啊!