ASP.NET Core MVC 源码学习:MVC 启动流程详解

本文深入探讨了ASP.NET Core MVC的启动流程,从Startup开始,逐步解析AddMvcCore、AddViews、AddRazorViewEngine、AddRazorPages等服务的注册过程。通过源码分析,揭示了MVC如何注入到DI容器中,以及ApplicationPartManager和ApplicationPart在框架中的角色。此外,还介绍了关键服务如ActionDescriptor、ControllerActionDescriptor和路由相关组件的注册。最后,总结了MVC启动过程中的服务注册及其在构建过程中扮演的角色。
摘要由CSDN通过智能技术生成

前言

上一篇 文章中,我们学习了 ASP.NET Core MVC 的路由模块,那么在本篇文章中,主要是对 ASP.NET Core MVC 启动流程的一个学习。

ASP.NET Core 是新一代的 ASP.NET 应用程序,它是跨平台的,并且不依赖于 IIS,新的 MVC Core 设计加入了依赖注入和模块化的 Http 处理管道,这篇文章我们一起通过源码看一下它的启动过程,每一步都很重要。

我们知道 MVC Core 是作为一个中间件程序,注册到 ASP.NET Core 管道流程中的,我先来回顾一下在以前基于 IIS 的传统 ASP.NET 程序。 传统的 ASP.NET 应用程序由可执行文件 InetMgr.exe (IIS 宿主进程)创建,然后调用受托管的应用程序入口,接着调用 HttpApplication.Application_Start() 进一步初始化,通常情况下,我们的初始化代码都写在 Application_StartGlobal.asax 中。

我们今天的主题是MVC 框架,所以针对 ASP.NET Core Host 和 Server 的初始化流程就不详细讲解了,由兴趣的同学可以翻看一下我的这篇文章。

ASP.NET Core 源码地址:https://github.com/aspnet/mvc

Getting Started

ASP.NET Core MVC 源码程序主要包含几部分组成:

  • Mvc.Core :源码的核心实现,包含认证,过滤,模型绑定,路由等等...

  • Mvc.Razor:Razor视图的拓展实现,模板引擎等,核心实现在Rozor那个项目。

  • Mvc.TagHelper:Razor中 TagHelper的主要实现。

  • Mvc.ViewFeatures:Razor中视图组件的渲染等。

从 Startup 说起

ASP.NET Core MVC 程序在启动之后,会经过一系列流程,然后到达 Microsoft.AspNetCore.Mvc包里的扩展程序 IMvcBuilder AddMvc(this IServiceCollection services) 中,然后我们从 ConfigureServices 这个分支说起吧。

Startup 启动的时候,会在 ConfigureServices 中注册 AddMvc 的 DI 服务,那么MVC也是在这个时候注入到DI容器中的,在MVC中所有的注入都是使用 TryAddXXX 的形式,也就是如果容器中已经有相关服务的话,将不会添加新注册的服务,所以如果你有一些服务需要进行重写的话,需要在 builder.AddMvc() 之前注册到DI中。

我们先看一下 AddMvc 的返回值 IMvcBuilder , IMvcBuilder 是一个针对 IServiceCollection 包装的一个接口,除了IServiceCollection之外,还有一个 ApplicationPartManager 。那么它是干嘛的呢?
从命名来看 ApplicationPartManager 是用来管理 ApplicationPart 的,那么其实除了里面 ApplicationPart 之外还有 IApplicationFeatureProvider

public interface IMvcBuilder{
    IServiceCollection Services { get; }

    ApplicationPartManager PartManager { get; }
}

ApplicationPart

它是 MVC Core 中引用的一个抽象的概念,它允许你暴露一些特性或者一些已知的资源,比如一些元数据信息,发布的资源,磁盘的文件等。
你可以在应用程序启动的时候进行 ApplicationPart 的配置,它是作为 IMvcBuilder 扩展的一部分。
目前 MVC 框架针对 ApplicationPart 的默认实现只有 AssemblyPart,当然你可以根据需要进行扩展。

ApplicationPartManager

private static void AddDefaultFrameworkParts(ApplicationPartManager partManager){  
 var mvcTagHelpersAssembly = typeof
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值