怎么在Asp.Net中使用ModelConvention实现全局过滤器隔离

  介绍

怎么在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>

怎么在Asp。网络中使用ModelConvention实现全局过滤器隔离

有了这些,我们可以做很多很灵活的操作,例如通过设置<代码> 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> 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实现全局过滤器隔离