前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >ASP.NET Core MVC应用模型的构建[1]: 应用的蓝图

ASP.NET Core MVC应用模型的构建[1]: 应用的蓝图

作者头像
蒋金楠
发布于 2024-02-27 01:19:26
发布于 2024-02-27 01:19:26
20800
代码可运行
举报
文章被收录于专栏:大内老A大内老A
运行总次数:0
代码可运行

我个人觉得这是ASP.NET Core MVC框架体系最核心的部分。原因很简单,MVC框架建立在ASP.NET Core路由终结点上,它最终的目的就是将每个Action方法映射为一个或者多个路由终结点,路由终结点根据附加在Action上的若干元数据构建而成。为了构建描述当前应用所有Action的元数据,MVC框架会提取出定义在当前应用范围内的所有Controller类型,并进一步构建出基于Controller的应用模型。应用模型不仅仅是构建Action元数据的基础,承载API的应用还可以利用它自动生成API开发文档,一些工具甚至可以利用应用模型自动生成消费API的客户端代码。这篇文章大概是两年之前写的,可能一些技术细节在最新版本的ASP.NET Core MVC已经发生了改变,但总体设计依然如此。

不论是面向Controller的MVC编程模型,还是面向页面的Razor Pages编程模型,客户端请求访问的目标都是某个Action,所以MVC框架的核心功能就是将请求路由到正确的Action,并通过执行目标Action的方式完成请求当前请求的处理。目标Action应该如何执行由描述它的元数据来决定,而这样的元数据是通过ApplicationModel类型标识的应用模型构建出来的。应用模型为MVC应用构建了一个基于Controller的蓝图,我们先从宏观的角度来看看这张蓝图是如何绘制的。

一、 总体设计

图1基本体现了MVC框架构建应用模型的总体设计。代表使用模型的ApplicationModel对象是通过作为工厂的ApplicationModelFactory对象构建的,但是具体的构建任务却落在注册的一系列IApplicationModelProvider和IApplicationModelConvention对象上。

clip_image002
clip_image002

图1 ApplicationModel的构建模型

具体来说,ApplicationModelFactory工程会先创建一个空的ApplicationModel对象,并利用注册的IApplicationModelProvider对象对这个对象进行完善和修正。在此之后,代表默认约定的一系列IApplicationModelConvention对象会依次被执行,它们会将针对应用模型的约定规则应用到同一个ApplicationModel对象上。经过这两个加工环节之后得到的ApplicationModel最终成为描述应用模型的蓝图。

二、ApplicationModel

表示应用模型的ApplicationModel对象不仅是常见Action元数据的依据,同时还有其他重要的用途。由于ApplicationModel对象绘制了整个应用的蓝图,我们经常不仅可以利用它来生成结构化API文档(比如Swagger),还可以利用它提供的元数据生成调用API的客户端代码。通过ApplicationModel表示的应用模型总体上具有如图2所示的结构:一个ApplicationModel对象包含多个描述Controller的ControllerModel对象,一个ControllerModel包含多个ActionModel和PropertyModel对象,ActionModel和PropertyModel是对定义在Controller类型中的Action方法和属性的描述。表示Action方法的ActionModel对象利用ParameterModel描述其参数。

clip_image004
clip_image004

图2 应用模型总体结构

三、IApplicationModelProvider

软件设计中我们经常会遇到这样的场景:我们需要构建一个由若干不同元素组成的复合对象,不同的组成元素具有不同的构建方式,MVC框架几乎基于采用了同一种模式来处理这样的场景。举个简单的例子:对象Foo需要实现的功能需要委托一组Bar对象来实现。MVC框架针对这种需求大都采用如图3所示模式来实现:Foo先创建一个上下文,并提供必要的输入,然后驱动每个Bar对象在这个上下文中完成各自的处理任务。所有Bar对象针对数据和状态的修改,以及产生的输出均体现在这个共享的上下文中,所有对象最终通过这个上下文就可以得到应有的状态或者所需的输出。

clip_image006
clip_image006

图3 基于共享上下文的多对象协作模式(单操作)

有时候我们甚至可以将Bar对象的操作分成两个步骤进行,比如我们将针对这两个步骤的操作分别命名为Executing和Executed。如图4所示,在创建共享上下文之后,Foo对象先按序执行每一个Bar对象的Executing操作,最后再反向执行每个Bar对象的Executed操作,所有的操作均在同一个上下文中执行。

clip_image008
clip_image008

图4 基于共享上下文的多对象协作模式(两阶段)

了解了上面所述的基于共享上下文的多对象协作对象构建模式之后,读者朋友们对于IApplicationModelProvider接口定义就很好理解了。如下面的代码片段所示,IApplicationModelProvider接口定了Order属性来决定了自身的执行顺序,而OnProvidersExecuting和OnProvidersExecuted方法分别完成针对Action元数据构建的两阶段任务。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface IApplicationModelProvider
{
    int Order { get; }
    void OnProvidersExecuted(ApplicationModelProviderContext context);
    void OnProvidersExecuting(ApplicationModelProviderContext context);
}

这里作为构建应用模型的执行上下文通过如下这个ApplicationModelProviderContext类型表示。如代码片段所示,ApplicationModelProviderContext类型定义了两个属性,其中ControllerTypes属性表示的列表提供了当前应用所有有效的Controller类型,而Result属性返回的ApplicationModel对象自然代表“待改造”的应用模型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ApplicationModelProviderContext
{
    public IEnumerable<TypeInfo> 	ControllerTypes { get; }
    public ApplicationModel 		Result { get; }

    public ApplicationModelProviderContext(IEnumerable<TypeInfo> controllerTypes);
}

MVC框架提供如下所示的几个针对IApplicationModelProvider接口的实现类型。对于最终用于描绘当前MVC应用的ApplicationModel对象,其承载的元数据绝大部分是由DefaultApplicationModelProvider对象提供的。AuthorizationApplicationModelProvider和CorsApplicationModelProvider主要提供针对授权和。而ApiBehaviorApplicationModelProvider则负责提供与API相关的描述信息。这些具体实现类型都是内部类型。

  • DefaultApplicationModelProvider:提供构成应用模型的绝大部分元数据。
  • AuthorizationApplicationModelProvider:提供与授权相关元数据。
  • CorsApplicationModelProvider:提供与跨域资源共享(CORS)相关的元数据。
  • ApiBehaviorApplicationModelProvider:提供与API行为相关的元数据
  • TempDataApplicationModelProvider:为定义在Controller类型中标注了TempDataAttribute特性的属性提供与临时数据保存相关的元数据。
  • ViewDataAttributeApplicationModelProvider:为定义在Controller类型中标注了ViewDataAttribute特性的属性提供与视图数据保存相关的元数据。

IApplicationModelProvider对象针对应用模型的构建是通过ApplicationModelFactory工厂驱动实施的,供这个工厂对象驱策的IApplicationModelProvider对象只需要预先注册到依赖注入容器框架即可。为MVC框架注册基础服务的AddMvcCore扩展方法具有针对DefaultApplicationModelProvider和ApiBehaviorApplicationModelProvider类型以及ApplicationModelFactory的服务注册。IServiceCollection接口的AddControllers扩展方法会添加针对AuthorizationApplicationModelProvider和 CorsApplicationModelProvider类型的注册。针对TempDataApplicationModelProvider ViewDataAttributeApplicationModelProvider类型的服务注册是在IServiceCollection接口的AddControllersWithViews扩展方法中被注册的。

四、IApplicationModelConvention

除了通过在依赖注入框架中注册自定义的IApplicationModelProvider实现类型或者对象方式来定制最终生成的应用模型之外,相同的功能还可以通过注册相应的IApplicationModelConvention对象来完成。顾名思义,IApplicationModelConvention对象旨在帮助我们为应用模型设置一些基于约定的元数据。如下面的代码片段所示,IApplicationModelConvention接口定义了唯一的Apply方法将实现在该方法的约定应用到指定的ApplicationModel对象上。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface IApplicationModelConvention
{
    void Apply(ApplicationModel application);
}

与IApplicationModelProvider对象或者实现类型的注册不同,供ApplicationModelFactory工厂使用的IApplicationModelConvention对象需要注册到作为MVC应用配置选项的MvcOptions对象上。具体来说,我们需要将注册的IApplicationModelConvention对象添加到MvcOptions如下所示的Conventions属性上。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MvcOptions : IEnumerable<ICompatibilitySwitch>
{
    public IList<IApplicationModelConvention> Conventions { get; }
}

五、其他约定

除了利用自定义的IApplicationModelConvention实现类型对整个应用模型进行定制之外,我们还可以针组成应用模型的某种“节点类型”(Controller类型、Action方法、方法参数等)定义相应的约定,这些约定都具有相应的接口。应用模型分别利用ControllerModel、ActionModel和ParameterModel类型来描述Controller类型、Action方法以及方法参数。我们可以分别实现如下的接口定义相应特性,并将它们分别标注到Controller类型、Action方法或者方法参数上,ApplicationModelFactory对象会自动提取这些特性并将它们提供的约定应用到对应类型的模型节点上。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface IControllerModelConvention
{
    void Apply(ControllerModel controller);
}

public interface IActionModelConvention
{
    void Apply(ActionModel action);
}

public interface IParameterModelConvention
{
    void Apply(ParameterModel parameter);
}

描述Controller类型属性的PropertyModel类型的最终目的是为了能够采用模型绑定的方式来完整针对对应属性的绑定,这与针对Action方法参数的绑定是一致的,所以PropertyModel和描述Action方法参数的ParameterModel类型具有相同的基类ParameterModelBase。为了定制Controller类型属性和Action方法参数类型的应用模型节点,MVC框架为我们定义了如下这个IParameterModelBaseConvention接口。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface IParameterModelBaseConvention
{
    void Apply(ParameterModelBase parameter);
}

我们可以和上面一样将实现类型定义成标注到属性和参数上特性,也可以让实现类型同时也实现IApplicationModelConvention接口。值得一提的是,MVC框架并没有提供一个针对PropertyModel类型的IPropertyModelConvention接口,针对Action方法参数的IParameterModelConvention接口和IParameterModelBaseConvention接口之间也不存在继承关系。

六、ApplicationModelFactory

如下所示的是作为应用模型创建工厂的ApplicationModelFactory类型的定义。如代码片段所示,ApplicationModelFactory是一个内部类型。ApplicationModelFactory利用在构造函数中注入的参数得到所有注册的IApplicationModelProvider和IApplicationModelConvention对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
internal class ApplicationModelFactory
{
    private readonly IApplicationModelProvider[] 		_providers;
    private readonly IList<IApplicationModelConvention> 	_conventions;

    public ApplicationModelFactory(IEnumerable<IApplicationModelProvider> providers, IOptions<MvcOptions> options)
    {
        _providers 	= providers.OrderBy(it => it.Order).ToArray();
        _conventions 	= options.Value.Conventions;
    }

    public ApplicationModel CreateApplicationModel(IEnumerable<TypeInfo> controllerTypes)
    {
        var context = new ApplicationModelProviderContext(controllerTypes);
        for (var index = 0; index < _providers.Length; index++)
        {
            _providers[index].OnProvidersExecuting(context);
        }
        for (int index = _providers.Length - 1; index >= 0; index--)
        {
            _providers[index].OnProvidersExecuted(context);
        }
        ApplicationModelConventions.ApplyConventions(context.Result, _conventions);
        return context.Result;
    }
}

ApplicationModelFactory针对应用模型的构建体现在它的CreateApplicationModel方法上。如上面的代码片段所示,ApplicationModelFactory对象先根据提供的Controller类型列表创建出一个ApplicationModelProviderContext上下文对象。接下来,ApplicationModelFactory将这个上下文作为参数,按照Order属性确定的顺序调用每个IApplicationModelProvider对象的OnProvidersExecuting方法,然后再逆序调用它们的OnProvidersExecuted方法。ApplicationModelFactory最后会将通过所有IApplicationModelProvider对象参与构建的ApplicationModel从ApplicationModelProviderContext上下文中提取出来,并将各种方式注册的约定应用在该对象上,具体的实现体现在如下这个ApplyConventions方法上。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
internal static class ApplicationModelConventions
{
    public static void ApplyConventions(ApplicationModel applicationModel, IEnumerable<IApplicationModelConvention> conventions)
    {
        foreach (var convention in conventions)
        {
            convention.Apply(applicationModel);
        }

        var controllers = applicationModel.Controllers.ToArray();
        foreach (var controller in controllers)
        {
            var controllerConventions = controller.Attributes.OfType<IControllerModelConvention>().ToArray();

            foreach (var controllerConvention in controllerConventions)
            {
                controllerConvention.Apply(controller);
            }

            var actions = controller.Actions.ToArray();
            foreach (var action in actions)
            {
                var actionConventions = action.Attributes.OfType<IActionModelConvention>().ToArray();

                foreach (var actionConvention in actionConventions)
                {
                    actionConvention.Apply(action);
                }

                var parameters = action.Parameters.ToArray();
                foreach (var parameter in parameters)
                {
                    var parameterConventions = parameter.Attributes.OfType<IParameterModelConvention>().ToArray();

                    foreach (var parameterConvention in parameterConventions)
                    {
                        parameterConvention.Apply(parameter);
                    }

                    var parameterBaseConventions = GetConventions<IParameterModelBaseConvention>(conventions, parameter.Attributes);
                    foreach (var parameterConvention in parameterBaseConventions)
                    {
                        parameterConvention.Apply(parameter);
                    }
                }
            }

            var properties = controller.ControllerProperties.ToArray();
            foreach (var property in properties)
            {
                var parameterBaseConventions = GetConventions<IParameterModelBaseConvention>(conventions, property.Attributes);

                foreach (var parameterConvention in parameterBaseConventions)
                {
                    parameterConvention.Apply(property);
                }
            }
        }
    }

    private static IEnumerable<TConvention> GetConventions<TConvention>(IEnumerable<IApplicationModelConvention> conventions, IReadOnlyList<object> attributes)
    {
        return Enumerable.Concat(conventions.OfType<TConvention>(), attributes.OfType<TConvention>());
    }
}

如上面的代码片段所示,注册在MvcOptions配置选项上的IApplicationModelConvention对象提供的约定会直接应用到ApplicationModel对象上。除此之外,Controller类型、Action方法和方法参数上标注的相应约定特性会被提取出来,它们承载的约定规则会分别应用到对应的ControllerModel、ActionModel和ParameterModel对象上。

对于表示Action方法参数的ParameterModel对象和表示Controller类型属性的ProperrtyModel对象来说,应用在对应参数和属性上实现了IParameterModelBaseConvention接口的特性,以及同时实现了IParameterModelBaseConvention接口的IApplicationModelConvention对象,会被提取出来并将它们承载的约定应用到对应的参数或者属性节点上。

ASP.NET Core MVC应用模型的构建[1]: 应用的蓝图

ASP.NET Core MVC应用模型的构建2: 应用模型

ASP.NET Core MVC应用模型的构建3: Controller模型

ASP.NET Core MVC应用模型的构建4: Action模型

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ASP.NET Core MVC应用模型的构建[2]: 定制应用模型
在对应用模型的基本构建方式具有大致的了解之后,我们来系统地认识一下描述应用模型的ApplicationModel类型。对于一个描述MVC应用模型的ApplicationModel对象来说,它承载的元数据绝大部分是由默认注册的DefaultApplicationModelProvider对象提供的,在接下来针对ApplicationModel及其相关类型(ControllerModel、ActionModel和ParameterModel等)的介绍中,我们还会着重介绍DefaultApplicationModelProvider对象采用怎样的方式提取并设置这些元数据。
蒋金楠
2024/02/28
1720
ASP.NET Core MVC应用模型的构建[2]: 定制应用模型
ASP.NET Core MVC应用模型的构建[3]: Controller的收集
从编程的角度来看,一个MVC应用是由一系列Controller类型构建而成的,所以对于一个代表应用模型的ApplicationModel对象来说,它的核心就是Controllers属性返回的一组ControllerModel对象,每个ControllerModel对象是应用模型针对Controller类型的描述。
蒋金楠
2024/02/29
1280
ASP.NET Core MVC应用模型的构建[3]: Controller的收集
【asp.net core】实现动态 Web API
远程工作已经一个月了,最近也算是比较闲,每天早上起床打个卡,快速弄完当天要做的工作之后就快乐摸鱼去了。之前在用 ABP 框架(旧版)的时候就觉得应用服务层写起来真的爽,为什么实现了个 IApplicationService 的空接口就可以变成 Web API,可惜的是之前一直没空去研究这一块的原理及其实现,园子里也找不到相关实现原理的文章(旧版 ABP 的倒是有,但是 asp.net core 无法参考)。最近闲起来,就看了一下 abp vnext 的源码,并且也参考了一下晓晨Master 介绍的 Panda.DynamicWebApi。我自己也简单实现了一遍动态 Web API,不禁感叹 asp.net core 设计之精妙。
李明成
2020/03/18
2.8K0
【asp.net core】实现动态 Web API
通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[上篇]:路由整合
《200行代码,7个对象——让你了解ASP.NET Core框架的本质》让很多读者对ASP.NET Core管道有了真实的了解。在过去很长一段时间中,有很多人私信给我:能否按照相同的方式分析一下MVC框架的设计与实现原理,希望这篇文章能够满足你们的需求。在对本章内容展开介绍之前,顺便作一下广告:《ASP.NET Core 3框架揭秘》已经开始销售,现时5折优惠还有最后4天,有兴趣的从这里入群购买。
蒋金楠
2020/03/24
1.2K0
通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[上篇]:路由整合
5. abp集成asp.net core
参照前篇《4. abp中的asp.net core模块剖析》,首先放张图,这也是asp.net core框架上MVC模块的扩展点
Ryan_OVO
2023/10/19
4520
5. abp集成asp.net core
模拟ASP.NET Core MVC设计与实现
前几天有人在我的《ASP.NET Core框架揭秘》读者群跟我留言说:“我最近在看ASP.NET Core MVC的源代码,发现整个系统太复杂,涉及的东西太多,完全找不到方向,你能不能按照《200行代码,7个对象——让你了解ASP.NET Core框架的本质》这篇文章思路剖析一下MVC框架”。对于ASP.NET Core MVC框架的涉及和实现,说难也难,毕竟一个Model Binding就够很多人啃很久,其实说简单也简单,因为整个流程是很清晰的。ASP.NET Core MVC支持基于Controller和Page的两种编程模式,虽然编程方式看起来不太一样,底层针对请求的处理流程其实是一致的。接下来,我同样使用简单的代码构建一个Mini版的MVC框架,让大家了解一下ASP.NET Core MVC背后的总体设计,以及针对请求的处理流程。[源代码从这里下载]。
蒋金楠
2023/11/09
3630
模拟ASP.NET Core MVC设计与实现
在Asp.Net Core中使用ModelConvention实现全局过滤器隔离
这来自于我把项目迁移到Asp.Net Core的过程中碰到一个问题。在一个web程序中同时包含了MVC和WebAPI,现在需要给WebAPI部分单独添加一个接口验证过滤器IActionFilter,常规做法一般是写好过滤器后给需要的控制器挂上这个标签,高级点的做法是注册一个全局过滤器,这样可以避免每次手动添加同时代码也更好管理。注册全局过滤器的方式为:
HOHO
2020/04/27
1.2K0
[ASP.NET Core MVC] 如何实现运行时动态定义Controller类型?
昨天有个朋友在微信上问我一个问题:他希望通过动态脚本的形式实现对ASP.NET Core MVC应用的扩展,比如在程序运行过程中上传一段C#脚本将其中定义的Controller类型注册到应用中,问我是否有好解决方案。我当时在外边,回复不太方便,所以只给他说了两个接口/类型:IActionDescriptorProvider和ApplicationPartManager。这是一个挺有意思的问题,所以回家后通过两种方案实现了这个需求。源代码从这里下载。
蒋金楠
2020/04/08
1.5K1
[ASP.NET Core MVC] 如何实现运行时动态定义Controller类型?
ASP.NET Core MVC应用模型的构建[4]: Action的选择
ControllerModel类型的Actions属性包含一组描述有效Action方法的ActionModel对象。对于定义在Controller类型中的所有方法,究竟哪些方法才能成为有效的Action方法呢?所以在正式介绍ActionModel类型之前,我们先来聊聊Action方法的选择规则。
蒋金楠
2024/03/01
1650
ASP.NET Core MVC应用模型的构建[4]: Action的选择
ASP.NET Core路由中间件[3]: 终结点(Endpoint)
到目前为止,ASP.NET Core提供了两种不同的路由解决方案。传统的路由系统以IRouter对象为核心,我们姑且将其称为IRouter路由。本章介绍的是最早发布于ASP.NET Core 2.2中的新路由系统,由于它采用基于终结点映射的策略,所以我们将其称为终结点路由。终结点路由自然以终结点为核心,所以先介绍终结点在路由系统中的表现形式。[更多关于ASP.NET Core的文章请点这里]
蒋金楠
2021/01/07
1.2K0
通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[下篇]:参数绑定
模拟框架到目前为止都假定Action方法是没有参数的,我们知道MVC框架对Action方法的参数并没有作限制,它可以包含任意数量和类型的参数。一旦将“零参数”的假设去除,ControllerActionInvoker针对Action方法的执行就变得没那么简单了,因为在执行目标方法之前需要绑定所有的参数。MVC框架采用一种叫做“模型绑定(Model Binding)”的机制来绑定目标Action方法的输出参数,这可以算是MVC框架针对请求执行流程中最为复杂的一个环节,为了让读者朋友们对模型绑定的设计和实现原理有一个大致的了解,模拟框架提供一个极简版本的实现。
蒋金楠
2020/04/01
1.3K0
通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[下篇]:参数绑定
ASP.NET MVC是如何运行的[2]: URL路由
在一个ASP.NET MVC应用来说,针对HTTP请求的处理和相应定义Controller类型的某个Action方法中,每个HTTP请求的目标对象不再像ASP .NET Web Form应用一样是一个物理文件,而是某个Controller的某个Action。目标Controller和Action的名称包含在HTTP请求中,而ASP.NET MVC的首要任务就是通过当前HTTP请求的解析得到正确的Controller和Action的名称。这个过程是通过ASP.NET MVC的URL路由机制来实现的。 一、Ro
蒋金楠
2018/02/07
1.8K0
深入解析ASP.NET Core MVC应用的模块化设计[上篇]
ASP.NET Core MVC的“模块化”设计使我们可以构成应用的基本单元Controller定义在任意的模块(程序集)中,并在运行时动态加载和卸载。这种为“飞行中的飞机加油”的方案是如何实现的呢?该系列的两篇文章将关注于这个主题,本篇着重介绍“模块化”的总体设计,下篇我们将演示将介绍“分散定义Controller”的N种实现方案。
蒋金楠
2024/03/06
3300
深入解析ASP.NET Core MVC应用的模块化设计[上篇]
ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上
ASP.NET MVC默认采用基于标准特性的Model验证机制,但是只有应用在Model类型及其属性上的ValidationAttribute才有效。如果我们能够将ValidationAttribut
蒋金楠
2018/01/15
7790
ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上
ASP.NET MVC是如何运行的(3): Controller的激活
ASP.NET MVC的URL路由系统通过注册的路由表对HTTP请求进行解析从而得到一个用于封装路由数据的RouteData对象,而这个过程是通过自定义的UrlRoutingModule对HttpApplication的PostResolveRequestCache事件进行注册实现的。RouteData中已经包含了目标Controller的名称,现在我们来进一步分析真正的Controller对象是如何被激活的。我们首先需要了解一个类型为MvcRouteHandler的类型。 一、MvcRouteHandle
蒋金楠
2018/02/07
8970
深入探讨ASP.NET MVC的筛选器
在ActionInvoker对Action的执行过程中,除了通过利用ActionDescriptor对Action方法的执行,以及之前进行的Model绑定与验证之外,还具有一个重要的工作,那就是对相关筛选器(Filter)的执行。ASP.NET MVC的筛选器是一种基于AOP(面向方面编程)的设计,我们将一些非业务的逻辑实现在相应的筛选器中,然后以一种横切(Crosscutting)的方式应用到对应的Action方法。当Action方法执行前后,这些筛选器会自动执行。ASP.NET MVC提供了四种类型的筛
蒋金楠
2018/01/15
1.3K0
深入探讨ASP.NET MVC的筛选器
使用 .NET6 打造动态 API
ApiLite是直接将Service层自动生成api路由,可以不用添加Controller,支持模块插件化,在项目开发中能够提高工作效率,降低代码量。
郑子铭
2022/03/22
1.1K0
ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidatorProvider
在《ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidator》中我们介绍了ASP.NET MVC用于Model验证的四种ModelValidator,那么这些ModelValidator是如何被创建的呢?ASP.NET MVC的很多组件(比如ModelBinder和Filter)都采用了基于Provider的提供机制,这篇文章为你讲述这些ModelValidator对应的ModelValidatorProvider。[本文已经同步到《How ASP.NE
蒋金楠
2022/05/09
1.4K0
Asp.Net Core AuthorizeAttribute 和AuthorizeFilter 跟进及源码解读
IdentityServer4已经分享了一些应用实战的文章,从架构到授权中心的落地应用,也伴随着对IdentityServer4掌握了一些使用规则,但是很多原理性东西还是一知半解,故我这里持续性来带大家一起来解读它的相关源代码,本文先来看看为什么Controller或者Action中添加Authorize或者全局中添加AuthorizeFilter过滤器就可以实现该资源受到保护,需要通过access_token才能通过相关的授权呢?今天我带大家来了解AuthorizeAttribute和AuthorizeFilter的关系及代码解读。
Jlion
2022/04/07
3.7K0
Asp.Net Core AuthorizeAttribute 和AuthorizeFilter 跟进及源码解读
从 MVC 到使用 ASP.NET Core 6.0 的Minimal API
https://benfoster.io/blog/mvc-to-minimal-apis-aspnet-6/
郑子铭
2021/11/10
7.7K0
推荐阅读
相关推荐
ASP.NET Core MVC应用模型的构建[2]: 定制应用模型
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文