内容提要
本文介绍了ASP.NET Core MVC应用模型的构建,重点讲解了ApplicationModel及其相关类型(如ControllerModel、ActionModel、ParameterModel等)。通过DefaultApplicationModelProvider提取元数据,定义了多个接口(如IPropertyModel、IFilterModel、IApiExplorerModel等),并探讨了如何自定义IApplicationModelProvider和约定以扩展应用模型的功能。最后,通过示例展示了如何注册全局过滤器和API元数据设置。
延伸解读
接口设计如何支撑应用模型的扩展性
文章通过IPropertyModel、ICommonModel、IFilterModel等接口,将应用模型的不同关注点分离。IPropertyModel提供Properties字典,允许任意扩展数据;ICommonModel统一了Controller、Action、Property节点的基本结构;IFilterModel则专门管理过滤器。这种设计让自定义IApplicationModelProvider或约定可以针对特定接口操作,而不必修改核心类型,体现了ASP.NET Core MVC应用模型的高度可扩展性。
全局过滤器的注册与默认过滤器的来源
示例中通过MvcOptions.Filters.Add(new FoobarAttribute())注册全局过滤器,最终ApplicationModel的Filters属性包含三个过滤器:显式注册的FoobarAttribute、AddMvcCore注册的UnsupportedContentTypeFilter以及AddControllersWithViews注册的SaveTempDataAttribute。这说明全局过滤器不仅来自开发者显式添加,框架自身也会根据服务注册添加默认过滤器,阅读Filters内容时需注
定制应用模型的两种途径:Provider与约定
文章演示了两种定制ApplicationModel的方式:自定义IApplicationModelProvider和实现IApplicationModelConvention。前者通过OnProvidersExecuting方法直接修改ApplicationModel,并可通过Order控制执行顺序;后者通过Apply方法应用约定,并注册到MvcOptions.Conventions。两者都能达到相同效果,但Provider更底层,适合处理程序集级元数据;约定更轻量,适合常规配置。选择时需考虑执行时机和复用性。
ApiExplorer元数据的作用与设置方式
IApiExplorerModel接口暴露ApiExplorer属性,其ApiExplorerModel包含IsVisible和GroupName,用于控制API是否在ApiExplorer中可见以及分组。文章示例通过程序集特性ApiExplorerAttribute读取设置,并在自定义Provider或约定中应用到ApplicationModel。这些元数据可帮助生成Swagger等API文档,或按分组生成客户端代码。默认情况下ApiExplorer属性未设置,需要显式定制。
Q&A
什么是ApplicationModel,它的主要功能是什么?
ApplicationModel是ASP.NET Core MVC中的一个类型,主要用于承载应用的元数据,包括控制器、动作和参数等信息。
如何自定义IApplicationModelProvider以扩展ApplicationModel的功能?
可以通过实现IApplicationModelProvider接口并注册自定义实现来扩展ApplicationModel的功能。
IFilterModel接口在ApplicationModel中有什么作用?
IFilterModel接口用于定义与Action执行相关的过滤器,允许在ApplicationModel、ControllerModel和ActionModel中注册过滤器。
IApiExplorerModel接口的主要用途是什么?
IApiExplorerModel接口用于提供API元数据支持,便于生成API文档和描述API终结点的信息。
如何通过约定定制ApplicationModel的设置?
可以通过实现IApplicationModelConvention接口并在MvcOptions中注册约定来定制ApplicationModel的设置。
DefaultApplicationModelProvider的作用是什么?
DefaultApplicationModelProvider负责提取和设置ApplicationModel的元数据,是ApplicationModel构建的默认提供者。