张文清 .Net西安社区 me@zhangwenqing.org ASP.NET Core应用生命周期指北 张文清 .Net西安社区 me@zhangwenqing.org
道生一,一生二, 二生三,三生万物 《道德经》
我是谁,我在哪 一些预备知识,概念和划重点
概念和体系:.NET Framework, .NET Core, ASP.NET, ASP.NET Core 图片出自2016年.NET Standard介绍 https://blogs.msdn.microsoft.com/dotnet/2016/09/26/introducing-net-standard/
Runtime, SDK, Package Runtime(运行时),.NET Core Runtime SDK,.NET Core SDK CoreCLR,包含JIT(Just In Time编译器),ILAsm(.NET IL中间语言编译程序),ILDasm( .NET IL中间语言反编译程序),TestHost(corehost.exe简单控制台执行器), mscorelib,一系 列原生类型和内部类型(包括.NET GC) CoreFX,System.Collections,System.IO,System.Xml等等其他组件 SDK,.NET Core SDK CLI,默认启动器,脚手架工具等 Roslyn,C#和VB.NET编译器和语言支持 SKD,MSBuild任务支持等其他VS必要组件 Fsc,F#语言支持 Package nuget (v3 json) ASP.NET Core所有的Assembly以nuget Package形式分发
1分钟Demo 创建并运行一个Hello .NET Group的 ASP.NET Core应用 观察结构和输出
启动 (Startup) 秩序建立开始
代码宏观角度看启动 Main()和IWebHostBuilder 固定的启动控制类Startup ConfigureServices() 应用程序的默认服务容器 依赖注入的入口 通常Helper方法命名为AddXXX Configure() 应用程序内容处理过程注册 通常Helper方法命名为UseXXX
依赖注入 (Dependency Injection) ASP.NET Core中的依赖称为Service 通过抽象接口来解耦实现 默认通过构造函数注入 提供内置Services https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency- injection?view=aspnetcore-2.1#framework-provided-services 提供三种Service生命周期:短暂(Transient,每次创建一个实例),作用域内( Scoped,每请求创建一个实例),单例(Singleton) 支持三方Service Container,例如Autofac 在ConfigureService中返回 IServiceProvider
5分钟Demo 在1分钟Demo上加入并调用一些Service, 调用部分内置Service,观察不同生命周期 的Service的使用情况
中间件 (Middleware) 过程管控
中间件(Middleware)的处理模型和设计理念
中间件(Middleware)的三种写法 app.Use( (context, next) => { next(); }); app.Map(“/endpoint”, (app) => { app.Run( (context) => { //TODO app.Run( (context)=> { /* TODO */ public class ConventionalMiddleware { private readonly RequestDelegate _next; public ConventionalMiddleware (RequestDelegate next) _next = next; } public async Task InvokeAsync (HttpContext context) //TODO: await _next(context); app.UseMiddleware<ConventionalMiddleware>(); public class FactoryActivatedMiddleware : IMiddleware { public async Task InvokeAsync (HttpContext context, RequestDelegate next) //TODO: await next(context); } // register service services.AddTransient<FactoryActivatedMiddle ware>(); // apply middleware app.UseMiddleware<FactoryActivatedMiddlewar e>();
5分钟Demo 实现不同方式的Middleware,观察顺序( Order)和管道工作方式
上下文(context) - 指引方向的北极星 Middleware中直接使用(参数传入) 通过注入依赖 IHttpContextAccessor 前提:services.AddHttpContextAccessor();
MVC生命周期
MVC全景图 Dependency Injection Model request Model binding Router Controller View (Razor) ViewComponent Format response response
5分钟Demo 实现一个简单的MVC应用,添加Model binding,输出view
退出 - 被忽略的落幕
安全退出(Graceful shutdown) Microsoft.AspNetCore.Hosting.IApplicationLifetime
免责声明 本篇所涉及均为个人观点 资料和数据均来自网络 感谢! 问题和讨论