怎么在Asp。网络中使用ModelConvention实现全局过滤器隔离?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
<强> ModelConvention 强>
ModelConvention定义了操作模型的入口,又或者说是一种契约,通过它我们可以对模型进行修改,常用的约定包括:
- <李>
IApplicationModelConvention
李> <李>IControllerModelConvention
李> <李>IActionModelConvention
李> <李>IParameterModelConvention
李> <李>IPageRouteModelConvention
李>这些接口提供了一个共同的方法<代码> 代码,应用方法参数是各自的应用程序模型,以<代码> IControllerModelConvention> 代码为例看一下它的定义:
namespace Microsoft.AspNetCore.Mvc.ApplicationModels { ,//,//摘要: ,//,Allows customization of 从而Microsoft.AspNetCore.Mvc.ApplicationModels.ControllerModel。 ,//,//言论: ,//,用use 却;能够接口,create an System.Attribute class which implements ,//,interface 以及place it 提醒a controller 类只Microsoft.AspNetCore.Mvc.ApplicationModels.IControllerModelConvention ,//customizations run after Microsoft.AspNetCore.Mvc.ApplicationModels.IApplicationModelConvention ,//customizations 以及before Microsoft.AspNetCore.Mvc.ApplicationModels.IActionModelConvention信息 ,//定制。 public interface IControllerModelConvention ,{ ,////,才能摘要://,才能,nbsp;用apply 从而convention 用,Microsoft.AspNetCore.Mvc.ApplicationModels.ControllerModel。 ,////才能,参数://才能,控制器://才能,从而Microsoft.AspNetCore.Mvc.ApplicationModels.ControllerModel。 void 才能申请(ControllerModel 控制器); ,} }
从接口摘要可以看的到,这个接口允许自定义<代码> ControllerModel> 代码对象,而如何自定义内容正是通过<代码> 代码>应用方法来实现,这个方法提供了当前<代码> ControllerModel> 代码对象的实例,我们可以在它身上获取到的东西实在太多了,看看它包含些什么:
有了这些,我们可以做很多很灵活的操作,例如通过设置<代码> ControllerName> 代码字段强制更改控制器的名称让程序中写死的控制器名失效,也可以通过<代码>过滤器> 代码字段动态更新它的过滤器集合,通过<代码> RouteValues> 代码来更改路由规则等等。
说到这里,很多人会觉得这玩意儿和自定义过滤器看起来差不多,最开始我也这么认为,但经过实际代码调试我发现它的生命周期要比过滤器早的多,或者说根本无法比较,这个家伙只需要在应用启动时执行一次并不用随着每次请求而执行。也就是说,它的执行时间比激活控制器还要早,那时候根本没有过滤器什么事儿,它的调用是发生在<代码> app.UseEndpoints() 代码>。
回到最开始的需求。基于上面的介绍,我们可以自定义如下的约定:
, public class ApiControllerAuthorizeConvention :, IControllerModelConvention ,{ public 才能;void 应用(ControllerModel 控制器) {才能 ,,if (controller.Filters.Any (x =祝辞,x is ApiControllerAttribute),,,, ! controller.Filters.Any (x =祝辞,x is AccessControlFilter)) ,,{ ,,,controller.Filters.Add (new AccessControlAttribute ()); ,,} ,,} 以前,}>上面的主要思路就是通过判断控制器本身的过滤器集合是否包含<代码> ApiControllerAttribute> 代码来识别是否API控制器,如果是API控制器并且没有标记过<代码> AccessControlAttribute> 代码的话就新建一个实例加入进去。
那么如何把这个约定注册到应用中呢?在Microsoft.AspNetCore.Mvc。MvcOptions中提供了<代码> 代码>属惯例性:
,////,才能摘要://,才能,Gets a list of Microsoft.AspNetCore.Mvc.ApplicationModels.IApplicationModelConvention//,才能,instances that will be applied 用,Microsoft.AspNetCore.Mvc.ApplicationModels.ApplicationModel//才能,when discovering 行动。 public 才能;IList< IApplicationModelConvention>, Conventions {,得到;}通过操作它就能把自定义约定注入进去:
怎么在Asp.Net中使用ModelConvention实现全局过滤器隔离